Python, funzione opposta urllib.urlencode


88

Come posso convertire i dati dopo l'elaborazione urllib.urlencodein dict? urllib.urldecodenon esiste.

Risposte:


124

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


1
Risposta molto approfondita. Eccezionale!
Hartley Brody

Voto positivo per Python 2, tuttavia Python 3 è tutto nel urllibmodulo. Vedi la risposta di @phobie.
openwonk

18

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'

16

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

2
Ha detto che voleva un dict. Quindi la tua risposta è sbagliata.
balrok

4
sì, questo è quello che stavo cercando.
Joe
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.