Python, entgegengesetzte Funktion urllib.urlencode


88

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

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 ;-).


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'

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'.

2
Er sagte, er wollte ein Diktat. Ihre Antwort ist also falsch.
Balrok

4
yay, das ist was ich gesucht habe.
Joe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.