2009-11-20 11 views
11

Utilizzo di Python2.4.5 (non chiedere!) Voglio analizzare una stringa di query e ottenere un ditt in risposta. Devo farlo "manualmente" come segue?parse query string con urllib in Python 2.4

>>> qs = 'first=1&second=4&third=3' 
>>> d = dict([x.split("=") for x in qs.split("&")]) 
>>> d 
{'second': '4', 'third': '3', 'first': '1'} 

Non ho trovato alcun metodo utile in urlparse.

risposta

23

si hanno due opzioni:

>>> cgi.parse_qs(qs) 
{'second': ['4'], 'third': ['3'], 'first': ['1']} 

o

>>> cgi.parse_qsl(qs) 
[('first', '1'), ('second', '4'), ('third', '3')] 

i valori nel dict restituito da cgi.parse_qs() sono liste piuttosto che stringhe, al fine di gestire il caso in cui viene specificato lo stesso parametro più volte:

>>> qs = 'tags=python&tags=programming' 
>>> cgi.parse_qs(qs) 
{'tags': ['python', 'programming']} 
+0

Grazie mille, Pär! –

+0

perché è restituito un array? Devo usare: [0] per ottenere il risultato finale della stringa. –

+0

@Bin Chen: la tua domanda è un po 'poco chiara, ma se ti stai chiedendo perché i valori nel dt restituito da 'cgi.parse_qs()' sono liste invece di stringhe, la risposta è che lo stesso parametro potrebbe essere specificato più volte, nel qual caso devono essere restituiti più valori. Questo è illustrato dall'ultimo esempio nella mia risposta. –

9

questo risolve il fastidio:

d = dict(urlparse.parse_qsl(qs)) 

personalmente mi aspetto che ci siano due wrapper integrati in urlparse. nella maggior parte dei casi non mi dispiacerebbe scartare il parametro ridondante se esiste

+0

parse_qsl è stato aggiunto in 2.6, a quel punto c'è parse_qs che già restituisce un dict. È questo che intendevi per un built-in? – Adam

1
import urlparse 
qs = 'first=1&second=4&third=3&first=0' 

print dict(urlparse.parse_qsl(qs)) 

OR 

print urlparse.parse_qs(qs)