Получение параметров из URL


164

Учитывая URL, подобный следующему, как я могу проанализировать значение параметров запроса? Например, в этом случае я хочу значение def.

/abc?def='ghi'

Я использую Django в своей среде; есть ли метод на requestобъекте, который может мне помочь?

Я пытался использовать, self.request.get('def')но он не возвращает значение, ghiкак я надеялся.

Ответы:


256

Python 2:

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

Python 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)
Winand

55

Я в шоке, это решение не здесь уже. Использование:

request.GET.get('variable_name')

Это «получит» переменную из словаря «GET» и вернет значение «variable_name», если оно существует, или объект None, если он не существует.


3
Это должен быть главный ответ. Работает как шарм.
muntasir2000

2
Я должен был уйти self, но я согласен с приведенным выше комментарием.
Мэтт Кременс

Я не могу заставить это работать. Может быть, еще несколько деталей. Как вы получаете запрос? Этот Python3 совместим?
ggedde

3
@gedde этот ответ (как и вопрос) предназначен для django, это объект запроса django. Если вы не используете Django, используйте один из ответов.
Florian

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, на который вы ссылаетесь, является типом запроса, и я вижу, что объект запроса поддерживает метод с именем arguments, чтобы получить аргументы запроса. Вы также можете попробовать 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, чтобы получить список параметров в строке запроса, которые не содержат значений. По умолчанию используется значение false. Некоторые дерьмовые написанные 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

Я вижу, что нет ответа для пользователей Торнадо:

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

Этот метод должен работать внутри обработчика, который получен из:

tornado.web.RequestHandler

Ни один из этих ответов не вернется, если запрошенный ключ не найден. Это спасает вас от обработки исключений.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.