Come posso convertire i dati dopo l'elaborazione urllib.urlencodein dict?
urllib.urldecodenon esiste.
Risposte:
Come la documentazione per urlencodeesempio,
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 cgimodulo). 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 de 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 dictper 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 ;-).
urllibmodulo. 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'.