Come posso convertire i dati dopo l'elaborazione urllib.urlencode
in dict?
urllib.urldecode
non esiste.
Risposte:
Come la documentazione per urlencode
esempio,
Il modulo urlparse fornisce le funzioni parse_qs () e parse_qsl () che vengono utilizzate per analizzare le stringhe di query nelle strutture di dati Python.
(Nelle versioni precedenti di Python, erano nel cgi
modulo). Quindi, ad esempio:
>>> 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']}
L'ovvia differenza tra il dizionario originale d
e quello "round trip" d1
è che quest'ultimo ha elenchi (di un elemento, in questo caso) come valori - questo perché non c'è garanzia di unicità nelle stringhe di query, e può essere importante alla tua app per sapere quali valori multipli sono stati dati per ogni chiave (ovvero, gli elenchi non saranno sempre quelli di un singolo elemento ;-).
Come alternativa:
>>> sq = urlparse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
puoi ottenere una sequenza di coppie (urlencode accetta anche questo argomento - in questo caso conserva l'ordine, mentre nel caso dict non c'è ordine da preservare ;-). Se sai che non ci sono "chiavi" duplicate, o non ti interessa se ce ne sono, allora (come ho mostrato) puoi chiamare dict
per ottenere un dizionario con valori non di elenco. In generale, tuttavia, devi considerare cosa vuoi fare se sono presenti duplicati (Python non lo decide per tuo conto ;-).
urllib
modulo. Vedi la risposta di @phobie.
Codice Python 3 per la soluzione di 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'alternativa:
>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
parse_qsl è reversibile:
>>> urllib.parse.urlencode(sq)
'a=b&c=d'
urllib.unquote_plus()
fa quello che vuoi. Sostituisce% xx escape con il loro equivalente a carattere singolo e sostituisce i segni più con spazi.
Esempio:
unquote_plus('/%7Ecandidates/?name=john+connolly')
rendimenti
'/~candidates/?name=john connolly'.