2011-10-18 5 views
67

Dopo aver utilizzato cgi.parse_qs(), come convertire il risultato (dizionario) in stringa di query? Alla ricerca di qualcosa di simile a urllib.urlencode().Come convertire un dizionario in query string in Python?

+5

NB: ['cgi.parse_qs()' è obsoleto. Utilizza invece urlparse.parse_qs().] (Http://docs.python.org/library/cgi.html#cgi.parse_qs) – Johnsyweb

+0

** Vedi anche: ** https://stackoverflow.com/questions/5607551/ how-to-urlencode-a-querystring-in-python – dreftymac

risposta

113

Da the docs:

urllib.urlencode (query [, doseq])
Converti un oggetto di mapping o una sequenza di tuple di due elementi di una stringa “cento-encoded” ... una serie di key=value coppie separate da caratteri '&' ...

un dict è una mappatura.

+0

Questo è vero, ma il 'dict' restituito da' cgi.parse_qs() 'ha effettivamente' list's come suoi "valori". Il passaggio di questi diritti comporterà stringhe di query dall'aspetto molto strano. – Johnsyweb

+5

Come dicono i documenti, questo è ciò che 'doseq' è per. –

+0

Abbastanza vero. Questo mi insegnerà a leggere più della prima frase! – Johnsyweb

-1

Forse siete alla ricerca di qualcosa di simile:

def dictToQuery(d): 
    query = '' 
    for key in d.keys(): 
    query += str(key) + '=' + str(d[key]) + "&" 
    return query 

Ci vuole un dizionario e convertirlo in una stringa di query, proprio come UrlEncode. Aggiungerà un finale "&" alla stringa di query, ma le correzioni return query[:-1], se si tratta di un problema.

+4

Hai già incontrato 'str.join()'? Che ne dite 'urllib.quote_plus()'? –

+1

@garbados La soluzione dovrebbe funzionare in casi semplici. Tuttavia, date un'occhiata a 'urlencode' in' urllib.py' (dovrebbe essere nella tua installazione di Python) per capire perché la creazione di una stringa di query a volte non è così semplice come implica la tua risposta (in particolare la necessità di "citare" certi caratteri che non sono validi in un URL). @ Ignacio ha anche fatto riferimento a due funzioni che potrebbero ripulire la tua implementazione e renderla corretta. –

+0

Ah, davvero. Ci scusiamo per l'implementazione cruda. Va a dimostrare che dovrei essere più attento a rispondere alle domande che non ho mai affrontato. – garbados

4

Stai cercando qualcosa esattamente come urllib.urlencode()!

Tuttavia, quando si chiama parse_qs() (distinta da parse_qsl()), le chiavi del dizionario sono i nomi delle variabili di query uniche e i valori sono elenchi di valori per ciascun nome.

Per passare queste informazioni in urllib.urlencode(), è necessario "livellare" questi elenchi. Ecco come si può fare con un elenco comprehenshion di tuple:

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist] 
urllib.urlencode(query_pairs) 
+11

Oppure potresti passare 'doseq = True'. –

+5

Oppure ho potuto leggere la documentazione e farlo! Sì :-) – Johnsyweb

+0

@downvoter: come posso migliorare questa risposta? Sono passati sei anni da quando l'ho scritto! – Johnsyweb

27

In python3, leggermente diversa:

from urllib.parse import urlencode 
urlencode({'pram1': 'foo', 'param2': 'bar'}) 

uscita: 'pram1=foo&param2=bar'

per python2 e la compatibilità python3, provate questo:

try: 
    #python2 
    from urllib import urlencode 
except ImportError: 
    #python3 
    from urllib.parse import urlencode