2012-04-11 41 views
32

在python中解析數據超出URL查詢字符串(例如,通過表單附加到URL的數據)的最佳方式是什麼?我的目標是接受表單數據並將其顯示在同一頁面上。我研究了幾種不太符合我要求的方法。解析URL查詢字符串的最佳方法

我正在創建一個簡單的Web服務器,以瞭解有關套接字的知識。這個網絡服務器不會用於任何測試目的。

GET /?1pm=sample&2pm=&3pm=&4pm=&5pm= HTTP/1.1 
Host: localhost:50000 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: http://localhost:50000/?1pm=sample&2pm=&3pm=&4pm=&5pm= 
+0

你是l從頭開始編寫解析,或者是什麼? – Marcin 2012-04-11 20:11:52

+2

什麼是錯的http://stackoverflow.com/questions/1349367/parse-an-http-request-authorization-header-with-python或http://stackoverflow.com/questions/4685217/parse-raw-http-頭。你還沒有給我們足夠的信息,說明缺少其他方法。你有一個頭或兩個例子嗎? – 2012-04-11 20:12:15

+0

這些帖子中沒有任何一個是錯誤的。根據我過去所掌握的編程經驗,我傾向於在第二個環節中做類似正則表達式的事情。但是,我想問一下,看看是否有更簡單的方法來做到這一點,因爲這是我的第一個Python程序。 – egoskeptical 2012-04-11 20:24:30

回答

41

裏的urllib.parse模塊是你的朋友:https://docs.python.org/3/library/urllib.parse.html

退房urllib.parse.parse_qs(解析查詢字符串,通過郵遞方式,至少對非GET或表單數據發送到服務器,即表單數據 - 多部分數據)。還有用於解釋多部分數據的cgi.FieldStorage

有關解析HTTP交互的其餘部分,請參閱RFC2616,這是HTTP/1.1協議規範。

+1

這很好,但沒有像完整的解決方案。 – Marcin 2012-04-11 20:12:42

+1

我不會爲他寫劇本。他特別詢問了如何解析查詢數據,至少這就是我在各行之間閱讀的內容,即使這些內容實際上並不是HTTP標頭。但是我沒有爲此評論。 – modelnine 2012-04-11 20:14:32

+0

我並不是建議你爲他寫腳本,但urlparse只是這個難題的一小部分。 – Marcin 2012-04-11 20:19:17

12

下面是使用python3 urllib.parse一個例子:

>>> from urllib.parse import urlparse, parse_qs 
>>> URL='https://someurl.com/with/query_string?i=main&mode=front&sid=12ab&enc=+Hello' 
>>> parsed_url = urlparse(URL) 
>>> parse_qs(parsed_url.query) 
{'i': ['main'], 'enc': [' Hello '], 'mode': ['front'], 'sid': ['12ab']} 

注意事項python2:from urlparse import urlparse, parse_qs

SEE:https://pythonhosted.org/six/#module-six.moves.urllib.parse

+0

爲什麼像這樣的值''['value']'''? '''dic ['enc']'''獲取'''['Hello']'''如何獲得'Hello'?與拆分? – Suisse 2017-07-17 01:36:33

+0

@Suisse請參閱https://stackoverflow.com/questions/11447391/ajax-why-jquery-replaces-with-a-space這些值在列表中,因爲可以編碼多個值,請參閱:https://stackoverflow.com/questions/2571145/urlencode-an-array-of-values希望它有幫助 – jmunsch 2017-07-18 20:47:30

1

如果您需要查詢字符串唯一密鑰,使用dict()parse_qsl()

import urllib.parse 
urllib.parse.urlparse('https://someurl.com/with/query_string?a=1&b=2&b=3').query 
    a=1&b=2&b=3 
urllib.parse.parse_qs('a=1&b=2&b=3'); 
    {'a': ['1'], 'b': ['2','3']} 
urllib.parse.parse_qsl('a=1&b=2&b=3') 
    [('a', '1'), ('b', '2'), ('b', '3')] 
dict(urllib.parse.parse_qsl('a=1&b=2&b=3')) 
    {'a': '1', 'b': '3'} 
相關問題