2010-08-22 3 views

risposta

112

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

+1

Alex Martelli, grazie! – Artyom

+0

@Derek, prego! –

+1

Risposta molto accurata. Eccezionale! –

14

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

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

+1

Ha detto, voleva un dittato. Quindi la tua risposta è sbagliata. – balrok

+3

yay, questo è quello che stavo cercando. – Joe