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.