2010-08-22 14 views

Respuesta

112

Como the docs para urlencode decir,

El módulo proporciona los urlparse funciones parse_qs() y (parse_qsl) que se utilizan para analizar las cadenas de consulta en las estructuras de datos de Python.

(En versiones anteriores de Python, estaban en el módulo cgi). Así, por ejemplo:

>>> import urllib 
>>> import urlparse 
>>> d = {'a':'b', 'c':'d'} 
>>> s = urllib.urlencode(d) 
>>> s 
'a=b&c=d' 
>>> d1 = urlparse.parse_qs(s) 
>>> d1 
{'a': ['b'], 'c': ['d']} 

La diferencia obvia entre el diccionario originales d y la "ronda disparada" uno d1 es que esta última tiene (de un solo punto, en este caso) listas como valores - esto se debe a que no existe una garantía de exclusividad en las cadenas de consulta, y puede ser importante para su aplicación saber qué valores múltiples se han otorgado para cada clave (es decir, las listas no siempre serán de un solo elemento ;-).

Como alternativa:

>>> sq = urlparse.parse_qsl(s) 
>>> sq 
[('a', 'b'), ('c', 'd')] 
>>> dict(sq) 
{'a': 'b', 'c': 'd'} 

puede obtener una secuencia de pares (urlencode acepta tal argumento, también - en este caso se preserva el orden, mientras que en el caso dict no hay fin de preservar; -). Si sabe que no hay "claves" duplicadas, o no le importa si las hay, entonces (como he demostrado) puede llamar al dict para obtener un diccionario con valores que no sean de lista. En general, sin embargo, debe considerar lo que desea hacer si los duplicados son presentes (Python no decide eso en su nombre ;-).

+1

Alex Martelli, ¡gracias! – Artyom

+0

@Derek, ¡de nada! –

+1

Respuesta muy completa. ¡Increíble! –

14

Python 3 code para la solución de Alex:

>>> import urllib.parse 
>>> d = {'a':'b', 'c':'d'} 
>>> s = urllib.parse.urlencode(d) 
>>> s 
'a=b&c=d' 
>>> d1 = urllib.parse.parse_qs(s) 
>>> d1 
{'a': ['b'], 'c': ['d']} 

La alternativa:

>>> sq = urllib.parse.parse_qsl(s) 
>>> sq 
[('a', 'b'), ('c', 'd')] 
>>> dict(sq) 
{'a': 'b', 'c': 'd'} 

parse_qsl es reversible:

>>> urllib.parse.urlencode(sq) 
'a=b&c=d' 
14

urllib.unquote_plus() hace lo que quiere. Reemplaza% xx escapes por su equivalente de un solo carácter y reemplaza los signos más con espacios.

Ejemplo: unquote_plus ('/% 7Ecandidates /? Name = john + connolly') produce '/ ~ candidates /? Name = john connolly'.

+1

Dijo que quería un dict. Entonces tu respuesta es incorrecta. – balrok

+3

yay, esto es lo que estaba buscando. – Joe