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.

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.


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.


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]

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]

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']

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".


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.


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


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 ()


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


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]

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

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

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

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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.