web-dev-qa-db-ja.com

URLクエリ文字列を解析する最良の方法

Pythonで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=
42
egoskeptical

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

rllib.parse.parse_qs (少なくともマルチパート以外のデータについては、クエリ文字列、つまりGETによってサーバーに送信されたフォームデータまたはPOSTによってポストされたフォームデータを解析します)をチェックアウトします。 cgi.FieldStorage もあり、multipart-dataを解釈します。

HTTP対話の残りの部分の解析については、HTTP/1.1プロトコル仕様である RFC2616 を参照してください。

44
modelnine

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

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

28
jmunsch

クエリ文字列から一意のキーが必要な場合は、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'}
8
ahuigo

ビルトインpython 2.7

>>> from urlparse import parse_qs
>>> parse_qs("search=quint&tags=python")
{'search': ['quint'], 'tags': ['python']}
1
Cuyler Quint