2010-08-22 4 views

Répondre

112

Comme the docs pour urlencode dire

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

(Dans les anciennes versions de Python, elles se trouvaient 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 et le « rond-trébuché » un d1 d'origine est que celui-ci a (un seul élément, dans ce cas) 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 que votre application sache quelles valeurs ont été données pour chaque clé (c'est-à-dire que les listes ne seront pas toujours individuelles).

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

+1

Alex Martelli, merci! – Artyom

+0

@Derek, de rien! –

+1

Réponse très complète. Impressionnant! –

14

Python 3 code 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' 
14

urllib.unquote_plus() fait ce que vous voulez. Il remplace% xx par leur équivalent à caractère unique et remplace les signes plus par des espaces. Exemple: unquote_plus ('/% 7Ecandidates /? Name = john + connolly') donne '/ ~ candidates /? Name = john connolly'.

+1

Il a dit, il voulait un dict. Donc, votre réponse est fausse. – balrok

+3

yay, c'est ce que je cherchais. – Joe

Questions connexes