Dopo l'uso cgi.parse_qs()
, come riconvertire il risultato (dizionario) in stringa di query? Alla ricerca di qualcosa di simile a urllib.urlencode()
.
Dopo l'uso cgi.parse_qs()
, come riconvertire il risultato (dizionario) in stringa di query? Alla ricerca di qualcosa di simile a urllib.urlencode()
.
Risposte:
urllib.parse.
urlencode
(query, doseq = False, [...])Converte un oggetto di mappatura o una sequenza di tuple a due elementi, che possono contenere oggetti str o byte, in una stringa di testo ASCII con codifica percentuale.
A dict
è una mappatura.
urllib.urlencode
(query
[,doseq
])
Converti un oggetto di mappatura o una sequenza di tuple di due elementi in una stringa "codificata in percentuale" ... una serie dikey=value
coppie separate da'&'
caratteri ...
dict
restituito da cgi.parse_qs()
ha effettivamente list
s come "valori". Il passaggio di questi direttamente risulterà in stringhe di query dall'aspetto molto strano.
In python3, leggermente diverso:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
produzione: 'pram1=foo¶m2=bar'
per la compatibilità con python2 e python3, prova questo:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
Stai cercando qualcosa esattamente come urllib.urlencode()
!
Tuttavia, quando si chiama parse_qs()
(distinto da parse_qsl()
), le chiavi del dizionario sono i nomi delle variabili di query univoci ei valori sono elenchi di valori per ogni nome.
Per passare queste informazioni urllib.urlencode()
, è necessario "appiattire" questi elenchi. Ecco come puoi farlo con una lista di comprensione di tuple:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
.
Forse stai cercando qualcosa del genere:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Prende un dizionario e lo converte in una stringa di query, proprio come urlencode. Aggiungerà un "&" finale alla stringa di query, ma lo return query[:-1]
risolverà, se si tratta di un problema.
str.join()
? Che ne dici urllib.quote_plus()
?
urlencode
a urllib.py
(dovrebbe da nel vostro Python installazione) per vedere il motivo per cui la creazione di una stringa di query a volte non è così semplice come la risposta implica (in particolare la necessità di 'quote' certi caratteri che non sono validi in un URL). @Ignacio ha anche fatto riferimento a due funzioni che ripulirebbero la tua implementazione e la renderebbero corretta.
from urllib.parse import urlencode; urlencode(your_dict)
) è più breve e più facile di questo! Concedo che a volte è intelligente reinventare la ruota, anche in modo scadente, quando è costoso o scomodo accedere a ruote esistenti e ben progettate, ma qui usare la ruota standard è più facile e veloce che far rotolare la tua ruota inferiore .
cgi.parse_qs()
è deprecato. Utilizza invece urlparse.parse_qs ().