PythonをディクテーションするURLクエリパラメータ


98

(いくつかのpythonライブラリを使用して)URLを解析し、URLのクエリパラメータ部分のキーと値を含むpython辞書を返す方法はありますか?

例えば:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

期待される収益:

{'ct':32, 'op':92, 'item':98}

回答:


187

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


37

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

1
これはPython 3に固有のものではなく、Python 2 urllib.parse_qsも値のリストを返します。ちなみに、私はこれを私の回答で具体的に述べていますが、単一の値だけが必要な場合urllib.parse_qsl()は、代わりに使用して、結果のリストをdict()貼り付けることもできます。
Martijn Pieters

との違いのようparse_qlsですが、タプルのリストを返すため、それをdictに変換する最初の値ではなく最後の値が保持されます。もちろん、これは最初から複数の値があったことを前提としています。
reubano

11

パーサーを使用したくない場合:

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つのライナーのみです。


6
解析には、文字列を分割するだけではありません。また、URLエンコーディング(を含む+)を処理する必要があります。urllib.parseまた、は要求に応じてエラーを生成または無視します。このホイールが標準ライブラリの一部であるのに、なぜこのホイールを作り直したいのかわかりません。
Martijn Pieters

6

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

4

ホイールを再発明しないことについては同意しますが、(学習中に)ホイールを理解するためにホイールを作成すると役立つ場合があります。:)したがって、純粋に学術的な観点から、ディクショナリを使用すると、名前と値のペアが一意である(クエリ文字列に複数のレコードが含まれていない)ことを前提とすることに注意してこれを提供します。

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を使用しています。


0

以下のためにpython2.7私が使用していますurlparse辞書へのURLのクエリを解析するためのモジュールを。

import urlparse

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.