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?
risposta
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 dikey=value
coppie separate da caratteri'&'
...
un dict
è una mappatura.
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
Come dicono i documenti, questo è ciò che 'doseq' è per. –
Abbastanza vero. Questo mi insegnerà a leggere più della prima frase! – Johnsyweb
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.
Hai già incontrato 'str.join()'? Che ne dite 'urllib.quote_plus()'? –
@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. –
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
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)
In python3, leggermente diversa:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
uscita: 'pram1=foo¶m2=bar'
per python2 e la compatibilità python3, provate questo:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
NB: ['cgi.parse_qs()' è obsoleto. Utilizza invece urlparse.parse_qs().] (Http://docs.python.org/library/cgi.html#cgi.parse_qs) – Johnsyweb
** Vedi anche: ** https://stackoverflow.com/questions/5607551/ how-to-urlencode-a-querystring-in-python – dreftymac