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.

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.


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.


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]

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]

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']

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."


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.


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


Nie powinno to być konieczne w aplikacji internetowej.
Nick Johnson,


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


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]

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

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

0

Jest fajna biblioteka w3lib.url

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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.