comment puis-je convertir des données après traitement urllib.urlencode de dict ? urllib.urldecode n'existe pas.
Réponses
Trop de publicités?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;-).
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'
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'.