Параметри запиту URL-адреси для продиктування python


98

Чи є спосіб проаналізувати URL-адресу (за допомогою якоїсь бібліотеки python) і повернути словник python із ключами та значеннями частини параметрів запиту URL-адреси?

Наприклад:

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

очікуваний прибуток:

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

Відповіді:


188

Використовуйте 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()and і urllib.parse.parse_qsl()аналізують рядки запитів, беручи до уваги, що ключі можуть траплятися більше одного разу і що порядок може мати значення.

Якщо ви все ще на Python 2, urllib.parseвикликали urlparse.


37

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

1
Це не властиво Python 3, Python 2 urllib.parse_qsтакож повертає списки значень. Я спеціально згадую про це у своїй відповіді, до речі, ви можете urllib.parse_qsl()замість цього скористатися і передати отриманий список, dict()якщо ви просто хочете одиничні значення.
Мартін Пітерс

Здається, різниця з 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))

Я знаю, що це те саме, що прийнята відповідь, лише в одному вкладиші, який можна скопіювати.


6
Синтаксичний аналіз передбачає не лише розбиття рядка. Вам також потрібно обробити кодування 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'}

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

Я використовую версію 3.6.5 в режимі очікування 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']} 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.