Pobieranie parametrów z adresu URL

164

Biorąc pod uwagę adres URL podobny do poniższego, jak mogę przeanalizować wartość parametrów zapytania? Na przykład w tym przypadku chcę mieć wartość def.

/abc?def='ghi'

Używam Django w moim środowisku; czy na requestobiekcie jest metoda, która mogłaby mi pomóc?

Próbowałem użyć, self.request.get('def')ale nie zwraca wartości, ghijak się spodziewałem.

niteshb
źródło

Odpowiedzi:

255

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_qszwraca listę wartości, więc wydrukowany zostanie powyższy kod ['ghi'].

Oto dokumentacja Python 3.

systempuntoout
źródło
58
W python3import urllib.parse as urlparse
Ivan De Paz Centeno
26
Zauważ, że parse_qszwróci ci obiekt listy. Musisz zdobyć pierwszy element, jeśli chcesz mieć stringurlparse.parse_qs(parsed.query)['def'][0]
raffaem
3
Zauważ, że jeśli adres url zawiera znak '#', tak jak to: foo.appspot.com/#/abc?def=ghi , musisz zabronić fragmentów: urlparse(url, allow_fragments=False)w przeciwnym razie zapytanie zwróci puste str.
codezjx
2
w pythonie3, należy użyć from urllib.parse import urlparse, parse_qsiparse_qs(parsed.query)
deathemperor
1
@FrancescoFrassinelli to ważne. urlparse.urlparse(url)->urlparse(url)
Winand
55

Jestem zszokowany, że tego rozwiązania już nie ma. Posługiwać się:

request.GET.get('variable_name')

To „pobierze” zmienną ze słownika „GET” i zwróci wartość „nazwa_zmiennej”, jeśli istnieje, lub obiekt None, jeśli nie istnieje.

jball037
źródło
3
To powinna być najlepsza odpowiedź. Działa jak marzenie.
muntasir2000
2
Musiałem przerwać self, ale zgadzam się z powyższym komentarzem.
Matt Cremeens
Nie mogę zmusić tego do pracy. Może więcej szczegółów. Jak otrzymujesz prośbę? Czy ten python3 jest kompatybilny?
ggedde
3
@ggedde ta odpowiedź (podobnie jak pytanie) dotyczy django, jest to obiekt żądania django. jeśli nie używasz django, użyj jednej z pozostałych odpowiedzi.
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]
Kryzys
źródło
46

dla Pythona> 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]
Anatolij E.
źródło
4
Najlepszy sposób na zrobienie tego IMO. Nie potrzebuje dodatkowych pakietów i działa A + na Pythonie 3.5.
wanaryytel
23

Jest nowa biblioteka o nazwie furl. Uważam, że ta biblioteka jest najbardziej pythonowa do wykonywania algebry adresów URL. Żeby zainstalować:

pip install furl

Kod:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']
Mayank Jaiswal
źródło
3
Świetna biblioteka! Nie wiedziałem o tym, ale działa jak urok :)
pasql
3
:) Zmarnowałem trochę czasu, próbując zmusić urlparse do pracy. Już nie.
Mayank Jaiswal,
18

Wiem, że to trochę za późno, ale ponieważ znalazłem się tutaj dzisiaj, pomyślałem, że może to być przydatna odpowiedź dla innych.

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

Z parse_qsl (), "Dane są zwracane jako lista par nazw i wartości."

iCanHasFay
źródło
5

Adres URL, do którego się odwołujesz, jest typem zapytania i widzę, że obiekt żądania obsługuje metodę o nazwie arguments w celu pobrania argumentów zapytania. Możesz także spróbować self.request.get('def')bezpośrednio uzyskać wartość z obiektu.

Senthil Kumaran
źródło
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)

Mam nadzieję że to pomoże

inspectorG4dget
źródło
Nie powinno to być konieczne w aplikacji internetowej.
Nick Johnson,
3

Moduł urlparse zapewnia wszystko, czego potrzebujesz:

urlparse.parse_qs ()

Andreas Jung
źródło
3

Nie ma takiej potrzeby. Tylko z

self.request.get('variable_name')

Zwróć uwagę, że nie określam metody (GET, POST itp.). Jest to dobrze udokumentowane i to jest przykład

Fakt, że używasz szablonów Django, nie oznacza, że ​​program obsługi jest również przetwarzany przez Django

chachan
źródło
3

W czystym Pythonie:

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]
Asym
źródło
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
Jerzy
źródło
0

Przy okazji, miałem problemy z używaniem parse_qs () i uzyskiwaniem pustych parametrów wartości i dowiedziałem się, że musisz przekazać drugi opcjonalny parametr „keep_blank_values”, aby zwrócić listę parametrów w ciągu zapytania, które nie zawierają żadnych wartości. Domyślnie jest to fałsz. Niektóre słabo napisane interfejsy API wymagają obecności parametrów, nawet jeśli nie zawierają one wartości

for k,v in urlparse.parse_qs(p.query, True).items():
  print k
sciweb
źródło
0

Jest fajna biblioteka w3lib.url

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi
Corvax
źródło
0

parametry = dict ([part.split ('=') dla części w get_parsed_url [4] .split ('&')])

Ten jest prosty. Zmienne parametry będą zawierały słownik wszystkich parametrów.

Mayuresh Satao
źródło
0

Widzę, że nie ma odpowiedzi dla użytkowników Tornado:

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

Ta metoda musi działać wewnątrz procedury obsługi, która pochodzi z:

tornado.web.RequestHandler

Brak jest odpowiedzią, którą ta metoda zwróci, gdy nie można znaleźć żądanego klucza. Oszczędza to obsługi wyjątków.

Oren_C
źródło