Recuperando parámetros de una URL

164

Dada una URL como la siguiente, ¿cómo puedo analizar el valor de los parámetros de consulta? Por ejemplo, en este caso quiero el valor de def.

/abc?def='ghi'

Estoy usando Django en mi entorno; ¿Hay algún método en el requestobjeto que pueda ayudarme?

Intenté usarlo, self.request.get('def')pero no devuelve el valor ghicomo esperaba.

niteshb
fuente

Respuestas:

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_qsdevuelve una lista de valores, por lo que se imprimirá el código anterior ['ghi'].

Aquí está la documentación de Python 3.

systemmpuntoout
fuente
58
En python3import urllib.parse as urlparse
Ivan De Paz Centeno
26
Tenga en cuenta que parse_qsle devolverá un objeto de lista. Necesitas obtener el primer elemento si quieres una cadenaurlparse.parse_qs(parsed.query)['def'][0]
raffaem
3
Tenga en cuenta que si la URL contiene el carácter '#' así: foo.appspot.com/#/abc?def=ghi , debe rechazar fragmentos: de lo urlparse(url, allow_fragments=False)contrario, la consulta devolverá str vacío.
codezjx
2
en python3, debe usar from urllib.parse import urlparse, parse_qsyparse_qs(parsed.query)
deathemperor
1
@FrancescoFrassinelli es válido. urlparse.urlparse(url)->urlparse(url)
Winand
55

Me sorprende que esta solución no esté aquí ya. Utilizar:

request.GET.get('variable_name')

Esto "obtendrá" la variable del diccionario "GET" y devolverá el valor 'variable_name' si existe, o un objeto None si no existe.

jball037
fuente
3
Esta debería ser la mejor respuesta. Funciona de maravilla.
muntasir2000
2
Tuve que dejarlo self, pero estoy de acuerdo con el comentario anterior.
Matt Cremeens
No puedo hacer que esto funcione. Quizás algunos detalles más. ¿Cómo estás recibiendo la solicitud? ¿Es este python3 compatible?
ggedde
3
@ggedde esta respuesta (como la pregunta) es para django, es un objeto de solicitud de django. si no está usando django, use una de las otras respuestas.
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]
Cris
fuente
46

para 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
fuente
44
La mejor manera de hacerlo OMI. No necesita paquetes adicionales y funciona A + en Python 3.5.
wanaryytel
23

Hay una nueva biblioteca llamada furl. Creo que esta biblioteca es más pitónica para hacer álgebra de URL. Instalar:

pip install furl

Código:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']
Mayank Jaiswal
fuente
3
Gran biblioteca! No lo sabía, pero funciona como un encanto :)
pasql
3
:) He perdido mi tiempo tratando de hacer que urlparse funcione para mí. No más.
Mayank Jaiswal
18

Sé que esto es un poco tarde, pero como me encontré aquí hoy, pensé que podría ser una respuesta útil para otros.

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 (), "Los datos se devuelven como una lista de pares de nombre y valor".

iCanHasFay
fuente
5

La url a la que hace referencia es un tipo de consulta y veo que el objeto de solicitud admite un método llamado argumentos para obtener los argumentos de la consulta. También puede intentar self.request.get('def')directamente obtener su valor del objeto.

Senthil Kumaran
fuente
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)

Espero que esto ayude

inspectorG4dget
fuente
Esto no debería ser necesario dentro de una aplicación web.
Nick Johnson
3

El módulo urlparse proporciona todo lo que necesita:

urlparse.parse_qs ()

Andreas Jung
fuente
3

No hay necesidad de hacer nada de eso. Solo con

self.request.get('variable_name')

Tenga en cuenta que no estoy especificando el método (GET, POST, etc.). Esto está bien documentado y este es un ejemplo.

El hecho de que use plantillas de Django no significa que el controlador también sea procesado por Django

chachan
fuente
3

En Python puro:

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
fuente
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
Jorge
fuente
0

Por cierto, estaba teniendo problemas para usar parse_qs () y obtener parámetros de valores vacíos y aprendí que debe pasar un segundo parámetro opcional 'keep_blank_values' para devolver una lista de los parámetros en una cadena de consulta que no contiene valores. Su valor predeterminado es falso. Algunas API mal escritas requieren la presencia de parámetros, incluso si no contienen valores

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

Hay una bonita biblioteca w3lib.url

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

parámetros = dict ([part.split ('=') para parte en get_parsed_url [4] .split ('&')])

Este es simple. Los parámetros variables contendrán un diccionario de todos los parámetros.

Mayuresh Satao
fuente
0

Veo que no hay una respuesta para los usuarios de Tornado:

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

Este método debe funcionar dentro de un controlador derivado de:

tornado.web.RequestHandler

Ninguna es la respuesta que devolverá este método cuando no se pueda encontrar la clave solicitada. Esto le ahorra un poco de manejo de excepciones.

Oren_C
fuente