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.

niteshb
quelle

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.

systempuntoout
quelle
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.

jball037
quelle
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]
Krise
quelle
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]
Anatoly E.
quelle
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']
Mayank Jaiswal
quelle
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."

iCanHasFay
quelle
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.

Senthil Kumaran
quelle
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

inspectorG4dget
quelle
Dies sollte in einer Webanwendung nicht erforderlich sein.
Nick Johnson
3

Das urlparse-Modul bietet alles, was Sie brauchen:

urlparse.parse_qs ()

Andreas Jung
quelle
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

Chachan
quelle
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]
Asym
quelle
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
George
quelle
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
sciweb
quelle
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
Corvax
quelle
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.

Mayuresh Satao
quelle
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.

Oren_C
quelle