Parameter von einer URL abrufen


164

Wie kann ich bei einer URL wie der folgenden den Wert der Abfrageparameter analysieren? In diesem Fall möchte ich zum Beispiel den Wert von def.

/abc?def='ghi'

Ich benutze Django in meiner Umgebung. Gibt es eine Methode für das requestObjekt, die mir helfen könnte?

Ich habe versucht self.request.get('def'), es zu verwenden, aber es gibt nicht den Wert zurück, den ghiich gehofft hatte.

Antworten:


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_qsGibt eine Liste mit Werten zurück, sodass der obige Code gedruckt wird ['ghi'].

Hier ist die Python 3-Dokumentation.


58
In Python3import urllib.parse as urlparse
Ivan De Paz Centeno

26
Beachten Sie, dass parse_qsSie ein Listenobjekt zurückgeben. Sie müssen das erste Element davon bekommen, wenn Sie einen String wollenurlparse.parse_qs(parsed.query)['def'][0]
Raffaem

3
Beachten Sie, dass Sie Fragmente nicht zulassen müssen , wenn die URL das Zeichen '#' wie folgt enthält : foo.appspot.com/#/abc?def=ghi : urlparse(url, allow_fragments=False)Andernfalls gibt die Abfrage eine leere Str zurück.
Codezjx

2
in Python3, muss from urllib.parse import urlparse, parse_qsundparse_qs(parsed.query)
Deathemperor

1
@FrancescoFrassinelli es ist gültig. urlparse.urlparse(url)->urlparse(url)
Winand

55

Ich bin schockiert, dass diese Lösung hier noch nicht verfügbar ist. Verwenden:

request.GET.get('variable_name')

Dadurch wird die Variable aus dem Wörterbuch "GET" "abgerufen" und der Wert "Variablenname" zurückgegeben, falls vorhanden, oder ein Objekt "Keine", wenn es nicht vorhanden ist.


3
Dies sollte die beste Antwort sein. Klappt wunderbar.
muntasir2000

2
Ich musste aufhören self, aber ich stimme dem obigen Kommentar zu.
Matt Cremeens

Ich kann das nicht zum Laufen bringen. Vielleicht noch ein paar Details. Wie bekommen Sie eine Anfrage? Ist das Python3 kompatibel?
Ggedde

3
@ggedde Diese Antwort (wie die Frage) ist für Django, es ist ein Django-Anfrageobjekt. Wenn Sie kein Django verwenden, verwenden Sie eine der anderen Antworten.
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

für 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
Der beste Weg, es IMO zu tun. Benötigt keine zusätzlichen Pakete und funktioniert A + unter Python 3.5.
Wanaryytel

22

Es gibt eine neue Bibliothek namens furl. Ich finde diese Bibliothek am pythonischsten für URL-Algebra. Installieren:

pip install furl

Code:

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

3
Tolle Bibliothek! Wusste nichts davon, funktioniert aber wie ein Zauber :)
Pasql

3
:) Ich habe meinen Teil der Zeit damit verschwendet, urlparse für mich arbeiten zu lassen. Nicht mehr.
Mayank Jaiswal

18

Ich weiß, dass dies etwas spät ist, aber da ich mich heute hier befand, dachte ich, dass dies eine nützliche Antwort für andere sein könnte.

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

Mit parse_qsl () werden "Daten als Liste von Name-Wert-Paaren zurückgegeben."


5

Die URL, auf die Sie verweisen, ist ein Abfragetyp, und ich sehe, dass das Anforderungsobjekt eine Methode namens Argumente unterstützt , um die Abfrageargumente abzurufen. Möglicherweise möchten Sie auch self.request.get('def')direkt versuchen , Ihren Wert aus dem Objekt zu erhalten.


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)

Hoffe das hilft


Dies sollte in einer Webanwendung nicht erforderlich sein.
Nick Johnson


3

Das muss man nicht tun. Nur mit

self.request.get('variable_name')

Beachten Sie, dass ich die Methode nicht spezifiziere (GET, POST usw.). Dies ist gut dokumentiert und dies ist ein Beispiel

Die Tatsache, dass Sie Django-Vorlagen verwenden, bedeutet nicht, dass der Handler auch von Django verarbeitet wird


3

In reinem 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

Übrigens hatte ich Probleme bei der Verwendung von parse_qs () und beim Abrufen leerer Werteparameter und erfuhr, dass Sie einen zweiten optionalen Parameter 'keep_blank_values' übergeben müssen, um eine Liste der Parameter in einer Abfragezeichenfolge zurückzugeben, die keine Werte enthält. Der Standardwert ist false. Einige beschissene geschriebene APIs erfordern, dass Parameter vorhanden sind, auch wenn sie keine Werte enthalten

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

0

Es gibt eine schöne Bibliothek w3lib.url

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

0

parameters = dict ([part.split ('=') für part in get_parsed_url [4] .split ('&')])

Dieser ist einfach. Die variablen Parameter enthalten ein Wörterbuch aller Parameter.


0

Ich sehe, dass es für Benutzer von Tornado keine Antwort gibt:

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

Diese Methode muss in einem Handler funktionieren, der abgeleitet ist von:

tornado.web.RequestHandler

Keine ist die Antwort, die diese Methode zurückgibt, wenn der angeforderte Schlüssel nicht gefunden werden kann. Dies erspart Ihnen einige Ausnahmebehandlungen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.