89 votes

Python, à l'opposé de la fonction urllib.urlencode

comment puis-je convertir des données après traitement urllib.urlencode de dict ? urllib.urldecode n'existe pas.

128voto

Alex Martelli Points 330805

Comme les docs pour urlencode - dire,

Le urlparse module fournit l' fonctions parse_qs() et parse_qsl() qui sont utilisées pour analyser les chaînes de requête en Python structures de données.

(Dans les anciennes versions de Python, qu'ils étaient dans l' cgi du module). Ainsi, par exemple:

>>> 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 différence la plus évidente entre le dictionnaire original d et les "aller-retour" un d1 , c'est que ce dernier a (un seul élément, dans ce cas) des listes de valeurs-c'est parce que il n'y a pas unicité de la garantie dans les chaînes de requête, et il peut être important de votre application, de savoir ce que plusieurs valeurs ont été donné pour chaque clé (qui est, les listes ne sont pas toujours être seul élément;-).

Comme une alternative:

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

vous pouvez obtenir une séquence de paires (urlencode accepte un tel argument, aussi-dans ce cas, il conserve l'ordre, tandis que dans le dict cas il n'y a pas d'ordre à préserver;-). Si vous savez il n'y a aucun doublon "clés", ou ne se soucient pas si il y a, alors (comme je l'ai montré), vous pouvez appeler dict pour obtenir un dictionnaire avec les non-valeurs de la liste. En général, cependant, vous ne devez considérer ce que vous voulez faire si des doublons sont présents (Python ne décide pas à votre place;-).

21voto

phobie Points 617

Python 3 code pour Alex de la solution:

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

L'alternative:

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

parse_qsl est réversible:

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

16voto

Andrew Farrell Points 172

urllib.unquote_plus() est-ce que vous voulez. Il Remplacera %xx échappe, de par leur caractère unique équivalent et remplace les signes plus avec des espaces.

Exemple: unquote_plus('/%7Ecandidates/?nom=jean+connolly'), on obtient '/~/candidats?nom=john connolly'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X