Параметры 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}
Ответы
Ответ 1
Используйте библиотеку 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
.
Ответ 2
Для 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'}
Ответ 3
Если вы предпочитаете не использовать парсер:
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
from urllib import urlparse as parse
Я знаю, что это так же, как принятый ответ, только в одном вкладыше, который можно скопировать.
Ответ 4
Для питона 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'}
Ответ 5
Я согласен не изобретать колесо, но иногда (пока вы учитесь) это помогает построить колесо, чтобы понять колесо. :) Итак, с чисто академической точки зрения, я предлагаю это с оговоркой, что при использовании словаря предполагается, что пары имя-значение уникальны (что строка запроса не содержит нескольких записей).
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('&')]
Я использую версию 3.6.5 в Idle IDE.
Ответ 6
Я создаю функцию для этого в моем проекте.
def qs_to_dict(qs):
final_dict = dict()
for item in qs.split("&"):
final_dict[item.split("=")[0]] = item.split("=")[1]
return final_dict
Использование
payload = "key1=value1&key2=value2&key3=value3"
qs_to_dict(payload)