2012-04-11 9 views
32

URLクエリ文字列(たとえば、フォームによってURLに追加されたデータ)からデータを解析する最も良い方法は何ですか?私の目標は、フォームデータを受け入れて同じページに表示することです。私が探しているものではないいくつかの方法を研究しました。URLクエリ文字列を解析するための最良の方法

私は、ソケットについて学ぶという目標を持って簡単なWebサーバーを作成しています。この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

あなたはですか?パースを最初から書き込むことは何ですか? – Marcin

+2

http://stackoverflow.com/questions/1349367/parse-an-http-request-authorization-header-with-python、またはhttp://stackoverflow.com/questions/4685217/parse-raw-http-ヘッダー。あなたは他のアプローチが欠けていることについて私たちに十分な情報を与えていない。あなたは例のヘッダーか2つを持っていますか? –

+0

これらの投稿のいずれも「間違っている」ものはありません。私が過去に経験したプログラミング経験に基づいて、私は第2のリンクの正規表現のような何かをする傾向があります。しかし、これが私の最初のpythonプログラムであるため、もっと簡単な方法があるかどうか聞いてみたかったのです。 – egoskeptical

答えて

41

はurllib.parseモジュールはあなたの友達です:https://docs.python.org/3/library/urllib.parse.html

チェックアウトurllib.parse.parse_qs(クエリ文字列、少なくとも非ために、POSTによって投稿GETまたはフォームデータによってサーバーに送信される、すなわちフォームデータを解析-multipart data)。マルチパートデータの解釈にはcgi.FieldStorageもあります。

HTTPインタラクションの残りの部分を解析するには、HTTP/1.1プロトコル仕様であるRFC2616を参照してください。ここで

+1

これはいいですが、完全な解決策のようなものではありません。 – Marcin

+1

私は彼のためのスクリプトを書いていません。彼は具体的に質問データを解析する方法を尋ねましたが、実際にはHTTPヘッダではないにしても、少なくとも私はその行の間で読んでいました。しかし、私はそれについてコメントしていませんでした。 – modelnine

+0

私は彼のためのスクリプトを書くべきではないと思っていますが、urlparseはこのパズルのほんの一部です。 – Marcin

12

のpython3 urllib.parseを使用した例です。python2ため

>>> 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']} 

注:from urlparse import urlparse, parse_qs

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

+0

そして、なぜこの値は '' '['value']' ''ですか? '' 'dic ['enc']' '' '' '' ['Hello]] '' ' - どのように' Hello 'を取得するのですか?分割して? – Suisse

+0

@Suisse https://stackoverflow.com/questions/11447391/ajax-why-jquery-replaces-with-a-spaceを参照してください。複数の値をエンコードできるため、値はリストにあります。https://stackoverflow.com/questions/2571145/urlencode-array-of-valuesは役に立ちました – jmunsch

1

あなたは、クエリ文字列から一意のキーが必要な場合は、parse_qsl()

dict()を使用
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'} 
関連する問題