Отримання параметрів з URL-адреси


164

З огляду на наступну URL-адресу, як я можу аналізувати значення параметрів запиту? Наприклад, у цьому випадку я хочу значення def.

/abc?def='ghi'

Я використовую Джанго в своєму оточенні; чи є метод на requestоб’єкті, який міг би мені допомогти?

Я спробував використовувати, self.request.get('def')але це не повертає значення, ghiяк я сподівався.

Відповіді:


256

Пітон 2:

import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']

Пітон 3:

import urllib.parse as urlparse
from urllib.parse import parse_qs
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(parse_qs(parsed.query)['def'])

parse_qsповертає список значень, тому вищевказаний код буде надрукований ['ghi'].

Ось документація на Python 3.


58
У python3import urllib.parse as urlparse
Іван Де Пас Сентено

26
Зверніть увагу, що parse_qsповерне вам об'єкт списку. Перший елемент потрібно отримати, якщо ви хочете рядокurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
Зауважте, що якщо URL містить символ "#" саме так: foo.appspot.com/#/abc?def=ghi , ви повинні заборонити фрагменти: urlparse(url, allow_fragments=False)інакше запит поверне порожню стрічку .
codezjx

2
в python3, повинен використовувати from urllib.parse import urlparse, parse_qsтаparse_qs(parsed.query)
deathemperor

1
@FrancescoFrassinelli це дійсно. urlparse.urlparse(url)->urlparse(url)
Вінанд

55

Я шокований, що це рішення вже не тут. Використання:

request.GET.get('variable_name')

Це "отримає" змінну зі словника "GET" та поверне значення "ім'я_ змінної", якщо воно існує, або об'єкт None, якщо він не існує.


3
Це має бути головна відповідь. Працює як шарм.
muntasir2000

2
Мені довелося піти self, але я згоден з вищезазначеним коментарем.
Метт Кремен

Я не можу змусити це працювати. Можливо, ще кілька деталей. Як ви отримуєте запит? Чи сумісний цей python3?
ggedde

3
@ggedde ця відповідь (як і питання) призначена для django, це об'єкт запиту django. якщо ви не використовуєте джанго, використовуйте одну з інших відповідей.
Флоріан

55
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)

print par['q'][0], par['p'][0]

46

для Python> 3.4

from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]

4
Найкращий спосіб зробити це ІМО. Не потрібні додаткові пакети та працює A + на Python 3.5.
wanaryytel

23

Існує нова бібліотека під назвою furl. Мені здається, що ця бібліотека є найбільш пітонічною для створення алгебри URL-адрес. Щоб встановити:

pip install furl

Код:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']

3
Чудова бібліотека! Не знав про це, але працює як шарм :)
pasql

3
:) Я витратив маю частку часу, намагаючись змусити urlparse працювати для мене. Не більше.
Mayank Jaiswal

18

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

import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
    print "Parameter = "+x,"Value = "+y

З parse_qsl (), "Дані повертаються у вигляді списку імен, пар значень."


5

URL-адреса, на яку ви посилаєтесь, - це тип запиту, і я бачу, що об’єкт запиту підтримує метод, який називається аргументами для отримання аргументів запиту. Ви також можете спробувати self.request.get('def')безпосередньо отримати цінність від об'єкта ..


3
def getParams(url):
    params = url.split("?")[1]
    params = params.split('=')
    pairs = zip(params[0::2], params[1::2])
    answer = dict((k,v) for k,v in pairs)

Сподіваюся, це допомагає


Це не повинно бути необхідним всередині веб-сторінки.
Нік Джонсон


3

Нічого цього робити не потрібно. Тільки с

self.request.get('variable_name')

Зауважте, що я не вказую метод (GET, POST тощо). Це добре задокументовано, і це приклад

Те, що ви використовуєте шаблони Django, не означає, що обробник також обробляється Django


3

У чистому Python:

def get_param_from_url(url, param_name):
    return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]

2
import cgitb
cgitb.enable()

import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i

0

До речі, у мене виникли проблеми з використанням parse_qs () та отримання порожніх параметрів значення, і я дізнався, що вам потрібно передати другий необов’язковий параметр 'Keep_blank_values', щоб повернути список параметрів у рядку запиту, який не містить значень. Це значення за замовчуванням до помилкового. Деякі API-файли з письмом вимагають наявності параметрів, навіть якщо вони не містять значень

for k,v in urlparse.parse_qs(p.query, True).items():
  print k

0

Є приємна бібліотека w3lib.url

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi

0

параметри = dict ([part.split ('=') для участі в get_parsed_url [4] .split ('&')])

Цей простий. Параметри змінної міститимуть словник усіх параметрів.


0

Я бачу, що для користувачів Tornado немає відповіді:

key = self.request.query_arguments.get("key", None)

Цей метод повинен працювати всередині обробника, який походить від:

tornado.web.RequestHandler

Ні, відповідь цього методу не повернеться, коли запитуваного ключа неможливо знайти. Це заощаджує певну обробку винятків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.