Python, entgegengesetzte Funktion urllib.urlencode

88

Wie kann ich Daten nach der Verarbeitung urllib.urlencodein Dikt konvertieren ? urllib.urldecodeist nicht vorhanden.

Artyom
quelle

Antworten:

124

Da die Dokumentation für urlencodesagen wir,

Das urlparse-Modul bietet die Funktionen parse_qs () und parse_qsl (), mit denen Abfragezeichenfolgen in Python-Datenstrukturen analysiert werden.

(In älteren Python-Versionen befanden sie sich im cgiModul). Also zum Beispiel:

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

Der offensichtliche Unterschied zwischen dem ursprünglichen Wörterbuch dund dem "Round-Triped" -Wörterbuch d1besteht darin, dass das letztere (in diesem Fall ein einzelnes Element) Listen als Werte enthält. Dies liegt daran, dass Abfragezeichenfolgen keine Eindeutigkeitsgarantie enthalten und möglicherweise wichtig sind in Ihrer App, um zu erfahren, welche Mehrfachwerte für jeden Schlüssel angegeben wurden (dh, die Listen sind nicht immer Einzelelemente ;-).

Als Alternative:

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

Sie können eine Folge von Paaren erhalten (Urlencode akzeptiert auch ein solches Argument - in diesem Fall wird die Reihenfolge beibehalten, während im Diktatfall keine Reihenfolge beibehalten werden muss ;-). Wenn Sie wissen, dass es keine doppelten "Schlüssel" gibt, oder wenn es Ihnen egal ist, können Sie (wie ich gezeigt habe) anrufen dict, um ein Wörterbuch mit Nicht-Listenwerten zu erhalten. Im Allgemeinen jedoch, tun Sie müssen sich überlegen , was Sie tun wollen , wenn Duplikate sind vorhanden (Python entscheiden nicht , dass in Ihrem Namen ;-).

Alex Martelli
quelle
1
Sehr gründliche Antwort. Genial!
Hartley Brody
Stimmen Sie für Python 2 ab, aber Python 3 ist alles im urllibModul. Siehe @ phobie Antwort.
Openwonk
18

Python 3-Code für Alex 'Lösung:

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

Die Alternative:

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

parse_qsl ist reversibel:

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

urllib.unquote_plus()macht was du willst. Es ersetzt% xx-Escapezeichen durch ihre Einzelzeichenäquivalente und ersetzt Pluszeichen durch Leerzeichen.

Beispiel:

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

ergibt

'/~candidates/?name=john connolly'.
Andrew Farrell
quelle
2
Er sagte, er wollte ein Diktat. Ihre Antwort ist also falsch.
Balrok
4
yay, das ist was ich gesucht habe.
Joe