2009-11-20 23 views
11

Usando Python2.4.5 (¡no preguntes!) Quiero analizar una cadena de consulta y obtener un dict a cambio. ¿Tengo que hacerlo "manualmente" de la siguiente manera?cadena de consulta de parse con urllib en Python 2.4

>>> qs = 'first=1&second=4&third=3' 
>>> d = dict([x.split("=") for x in qs.split("&")]) 
>>> d 
{'second': '4', 'third': '3', 'first': '1'} 

No se encontró ningún método útil en urlparse.

Respuesta

23

tiene dos opciones:

>>> cgi.parse_qs(qs) 
{'second': ['4'], 'third': ['3'], 'first': ['1']} 

o

>>> cgi.parse_qsl(qs) 
[('first', '1'), ('second', '4'), ('third', '3')] 

los valores de la dict devuelto por cgi.parse_qs() son listas en lugar de cadenas, con el fin de manejar el caso cuando se especifica el mismo parámetro varias veces:

>>> qs = 'tags=python&tags=programming' 
>>> cgi.parse_qs(qs) 
{'tags': ['python', 'programming']} 
+0

Muchas gracias, Pär! –

+0

¿por qué se devuelve una matriz? Tengo que usar: [0] para obtener el resultado final de la secuencia. –

+0

@Bin Chen: Su pregunta es un poco confusa, pero si pregunta por qué los valores en el dict devuelto por 'cgi.parse_qs()' son listas en lugar de cadenas, la respuesta es que el mismo parámetro podría especificarse varios veces, en cuyo caso deben devolverse valores múltiples. Esto se ilustra con el último ejemplo en mi respuesta. –

9

esto resuelve la molestia:

d = dict(urlparse.parse_qsl(qs)) 

Personalmente, esperaría que hubiera dos en un contenedor incorporado en urlparse. en la mayoría de los casos no me importaría descartar el parámetro redundante si existe

+0

se agregó parse_qsl en 2.6, en cuyo punto hay parse_qs que ya devuelve un dict. ¿Es eso lo que querías decir con un built-in? – Adam

1
import urlparse 
qs = 'first=1&second=4&third=3&first=0' 

print dict(urlparse.parse_qsl(qs)) 

OR 

print urlparse.parse_qs(qs)