Параметры запроса URL для dict python

есть ли способ проанализировать URL (с некоторой библиотекой python) и вернуть словарь python с ключами и значениями параметров запроса части URL?

например:

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

ожидаемый доход:

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

4 ответов


использовать 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 значения dict из parse_qs находятся в списке, потому что может быть несколько значений. Если вы просто хотите первый:

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

Если вы предпочитаете не использовать парсер:

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("&") ]}

для 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'}