web-dev-qa-db-fra.com

Python, fonction opposée urllib.urlencode

Comment puis-je convertir des données après le traitement urllib.urlencode à dicter? urllib.urldecode n'existe pas.

86
Artyom

Comme la documentation pour urlencode disons,

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

(Dans les anciennes versions Python, elles étaient dans le module cgi). 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 évidente entre le dictionnaire d'origine d et celui "à déclenchement multiple" d1 est que ce dernier a (un seul élément, dans ce cas) des listes comme valeurs - c'est parce qu'il n'y a pas de garantie d'unicité dans les chaînes de requête, et il peut être important pour votre application de savoir quelles valeurs multiples ont été données pour chaque clé (c'est-à-dire que les listes ne seront pas toujours des éléments uniques ;-).

Comme 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 également un tel argument - dans ce cas, il préserve l'ordre, tandis que dans le cas dict, il n'y a pas d'ordre à conserver ;-). Si vous savez qu'il n'y a pas de "clés" en double, ou si cela ne vous dérange pas, alors (comme je l'ai montré) vous pouvez appeler dict pour obtenir un dictionnaire avec des valeurs non listées. En général, cependant, vous devez considérer ce que vous voulez faire si des doublons sont présents (Python ne décide pas cela en votre nom ;-) .

120
Alex Martelli

code Python pour la solution d'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']}

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'
17
phobie

urllib.unquote_plus() fait ce que vous voulez. Il remplace% xx échappe par leur équivalent à un seul caractère et remplace les signes plus par des espaces.

Exemple:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

les rendements

'/~candidates/?name=john connolly'.
16
Andrew Farrell