Параметры URL-запроса для определения Python

101

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

Например:

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

ожидаемое возвращение:

{'ct':32, 'op':92, 'item':98}
Леонардо Андраде
источник

Ответы:

191

Воспользуйтесь 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.

Мартейн Питерс
источник
38

Для Python 3 значения dict from 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'}
Reubano
источник
1
Это не уникально для Python 3, Python 2 urllib.parse_qsтакже возвращает списки значений. Я специально упоминаю об этом в своем ответе, кстати, вы можете использовать urllib.parse_qsl()вместо этого и пропустить полученный список, dict()если вам просто нужны отдельные значения.
Мартейн Питерс
Похоже , разница с parse_qls, что , поскольку она возвращает список кортежей, преобразование , что в Словарь будет держать последнее значение вместо первого . Это, конечно, предполагает, что изначально было несколько значений.
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))

Я знаю, что это то же самое, что и принятый ответ, только в одном лайнере, который можно скопировать.

Томос Уильямс
источник
7
Анализ включает в себя нечто большее, чем просто разделение строки. Вам также необходимо обработать кодировку URL-адресов (включая +), а urllib.parseтакже либо вызывает, либо игнорирует ошибки для вас по запросу. Я не уверен, зачем вам изобретать это колесо, если оно входит в стандартную библиотеку.
Мартин Питерс
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'}
Анураг Мишра
источник
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.

Клариус
источник
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']} 
Тамим
источник