(いくつかのpythonライブラリを使用して)URLを解析し、URLのクエリパラメータ部分のキーと値を含むpython辞書を返す方法はありますか?
例えば:
url = "http://www.example.org/default.html?ct=32&op=92&item=98"
期待される収益:
{'ct':32, 'op':92, 'item':98}
(いくつかのpythonライブラリを使用して)URLを解析し、URLのクエリパラメータ部分のキーと値を含むpython辞書を返す方法はありますか?
例えば:
url = "http://www.example.org/default.html?ct=32&op=92&item=98"
期待される収益:
{'ct':32, 'op':92, 'item':98}
回答:
urllib.parse
ライブラリを使用する:
>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}
urllib.parse.parse_qs()
およびurllib.parse.parse_qsl()
方法は、キーが複数回発生する可能性があることを考慮に入れて、その順序は重要であり、クエリ文字列を解析しました。
まだPython 2を使用している場合urllib.parse
は、と呼ばれていましたurlparse
。
Python 3の場合、parse_qs
複数の値が存在する可能性があるため、dict fromの値はリストに含まれています。最初のものだけが必要な場合:
>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}
parse_qls
ですが、タプルのリストを返すため、それをdictに変換すると、最初の値ではなく最後の値が保持されます。もちろん、これは最初から複数の値があったことを前提としています。
パーサーを使用したくない場合:
url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}
したがって、上記のものは削除しませんが、使用するべきものではありません。
私はいくつかの答えを読んだと思いますが、あなたが私のようであれば、私の解決策を使用しないでください。
これを使って:
from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))
そしてPython 2.Xの場合
import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))
これは、受け入れ可能な回答と同じで、コピーできる1つのライナーのみです。
+
)を処理する必要があります。urllib.parse
また、は要求に応じてエラーを生成または無視します。このホイールが標準ライブラリの一部であるのに、なぜこのホイールを作り直したいのかわかりません。
Python 2.7の場合
In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"
In [15]: from urlparse import urlparse, parse_qsl
In [16]: parse_url = urlparse(url)
In [17]: query_dict = dict(parse_qsl(parse_url.query))
In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}
ホイールを再発明しないことについては同意しますが、(学習中に)ホイールを理解するためにホイールを作成すると役立つ場合があります。:)したがって、純粋に学術的な観点から、ディクショナリを使用すると、名前と値のペアが一意である(クエリ文字列に複数のレコードが含まれていない)ことを前提とすることに注意してこれを提供します。
url = 'http:/mypage.html?one=1&two=2&three=3'
page, query = url.split('?')
names_values_dict = dict(pair.split('=') for pair in query.split('&'))
names_values_list = [pair.split('=') for pair in query.split('&')]
Idle IDEでバージョン3.6.5を使用しています。
urllib.parse_qs
も値のリストを返します。ちなみに、私はこれを私の回答で具体的に述べていますが、単一の値だけが必要な場合urllib.parse_qsl()
は、代わりに使用して、結果のリストをdict()
貼り付けることもできます。