Recupero dei parametri da un URL


164

Dato un URL come il seguente, come posso analizzare il valore dei parametri della query? Ad esempio, in questo caso voglio il valore di def.

/abc?def='ghi'

Sto usando Django nel mio ambiente; c'è un metodo requestsull'oggetto che potrebbe aiutarmi?

Ho provato a utilizzare self.request.get('def')ma non sta restituendo il valore ghicome speravo.

Risposte:


256

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_qsrestituisce un elenco di valori, quindi verrà stampato il codice sopra ['ghi'].

Ecco la documentazione di Python 3.


58
In python3import urllib.parse as urlparse
Ivan De Paz Centeno,

26
Nota che parse_qsti restituirà un oggetto elenco. Devi ottenere il primo elemento se vuoi una stringaurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
Nota che se l'URL contiene un carattere '#' proprio come questo: foo.appspot.com/#/abc?def=ghi , devi impedire i frammenti :,urlparse(url, allow_fragments=False) altrimenti la query restituirà str vuota.
codezjx,

2
in python3, deve usare from urllib.parse import urlparse, parse_qseparse_qs(parsed.query)
deathemperor il

1
@FrancescoFrassinelli è valido. urlparse.urlparse(url)->urlparse(url)
Winand

55

Sono scioccato che questa soluzione non sia già disponibile. Uso:

request.GET.get('variable_name')

Questo "prenderà" la variabile dal dizionario "GET" e restituirà il valore "nome_varia" se esiste, o un oggetto Nessuno se non esiste.


3
Questa dovrebbe essere la risposta migliore. Funziona come un fascino.
muntasir2000,

2
Ho dovuto smettere self, ma sono d'accordo con il commento sopra.
Matt Cremeens,

Non riesco a farlo funzionare. Forse qualche dettaglio in più. Come stai ricevendo la richiesta? Questo python3 è compatibile?
ggedde,

3
@ggedde questa risposta (come la domanda) è per django, è un oggetto richiesta django. se non stai usando django, usa una delle altre risposte.
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

per 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
Il modo migliore per farlo IMO. Non ha bisogno di pacchetti extra e funziona con A + su Python 3.5.
wanaryytel,

23

C'è una nuova biblioteca chiamata furl. Trovo che questa libreria sia la più pitonica per fare url algebra. Installare:

pip install furl

Codice:

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

3
Ottima biblioteca! Non lo sapevo ma funziona come un fascino :)
pasql

3
:) Ho perso la mia parte di tempo cercando di far funzionare urlparse per me. Non piu.
Mayank Jaiswal

18

So che è un po 'tardi, ma da quando mi sono ritrovato qui oggi, ho pensato che potesse essere una risposta utile per gli altri.

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

Con parse_qsl (), "I dati vengono restituiti come un elenco di nomi, coppie di valori."


5

L'URL a cui ti riferisci è un tipo di query e vedo che l'oggetto richiesta supporta un metodo chiamato argomenti per ottenere gli argomenti della query. Puoi anche provare self.request.get('def')a ottenere direttamente il tuo valore dall'oggetto.


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)

Spero che questo ti aiuti


Questo non dovrebbe essere necessario all'interno di una webapp.
Nick Johnson,

3

Il modulo urlparse fornisce tutto ciò di cui hai bisogno:

urlparse.parse_qs ()


3

Non è necessario fare nulla di tutto ciò. Solo con

self.request.get('variable_name')

Si noti che non sto specificando il metodo (GET, POST, ecc.). Questo è ben documentato e questo è un esempio

Il fatto che tu usi modelli Django non significa che anche il gestore sia elaborato da Django


3

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

A proposito, stavo riscontrando problemi usando parse_qs () e ottenendo parametri di valore vuoti e ho imparato che è necessario passare un secondo parametro facoltativo 'keep_blank_values' per restituire un elenco dei parametri in una stringa di query che non contiene valori. Il valore predefinito è false. Alcune API scritte scadenti richiedono che siano presenti parametri anche se non contengono valori

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

0

C'è una bella libreria w3lib.url

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

0

parametri = dict ([part.split ('=') per la parte in get_parsed_url [4] .split ('&')])

Questo è semplice. I parametri variabili conterranno un dizionario di tutti i parametri.


0

Vedo che non esiste una risposta per gli utenti di Tornado:

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

Questo metodo deve funzionare all'interno di un gestore derivato da:

tornado.web.RequestHandler

Nessuna è la risposta che restituirà questo metodo quando non è possibile trovare la chiave richiesta. Ciò consente di risparmiare un po 'di gestione delle eccezioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.