Come posso convertire i dati dopo l'elaborazione di urllib.urlencode
da dettare? urllib.urldecode
non esiste.Python, funzione opposta urllib.urlencode
risposta
quanto the docs per urlencode
dire,
Il modulo urlparse fornisce le funzioni parse_qs() e (parse_qsl) utilizzati per analizzare le stringhe di query in strutture dati di Python.
(Nelle vecchie versioni di Python, erano nel modulo cgi
). Così, per 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'ovvio differenza tra il dizionario originale d
e il "round-scattato" uno d1
è che quest'ultimo ha (singolo elemento, in questo caso) liste come valori - questo perché non esiste una garanzia di univocità nelle stringhe di query e potrebbe essere importante per la tua app sapere quali valori multipli sono stati dati per ogni chiave (cioè, gli elenchi non saranno sempre di quelli a singolo elemento ;-).
In alternativa:
>>> sq = urlparse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
è possibile ottenere una sequenza di coppie (urlencode accetta un tale argomento, anche - in questo caso conserva ordine, mentre nel caso dict non c'è fine di preservare; -). Se sai che non ci sono "chiavi" duplicate, o non ti interessa se ci sono, allora (come ho mostrato) puoi chiamare dict
per ottenere un dizionario con valori non di lista. In generale, tuttavia, è necessario prendere in considerazione ciò che si vuole fare se i duplicati sono presenti (Python non decide che per vostro conto ;-).
Python 3 code per 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 ciò che si vuole. Sostituisce% xx escape con il loro equivalente a carattere singolo e sostituisce più segni con spazi.
Esempio: unquote_plus ('/% 7Ecandidates /? Name = john + connolly') restituisce '/ ~ candidati /? Name = john connolly'.
Alex Martelli, grazie! – Artyom
@Derek, prego! –
Risposta molto accurata. Eccezionale! –