Depois de usar cgi.parse_qs()
, como converter o resultado (dicionário) de volta em string de consulta? Procurando por algo semelhante a urllib.urlencode()
.
Depois de usar cgi.parse_qs()
, como converter o resultado (dicionário) de volta em string de consulta? Procurando por algo semelhante a urllib.urlencode()
.
Respostas:
urllib.parse.
urlencode
(consulta, doseq = Falso, [...])Converta um objeto de mapeamento ou uma sequência de tuplas de dois elementos, que pode conter objetos str ou bytes, em uma string de texto ASCII com codificação percentual.
A dict
é um mapeamento.
urllib.urlencode
(query
[,doseq
])
Converta um objeto de mapeamento ou uma sequência de tuplas de dois elementos em uma string "codificada em porcentagem" ... uma série dekey=value
pares separados por'&'
caracteres ...
dict
retornado por cgi.parse_qs()
realmente tem list
s como seus "valores". Passá-los diretamente resultará em strings de consulta de aparência muito estranha.
Em python3, ligeiramente diferente:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
resultado: 'pram1=foo¶m2=bar'
para compatibilidade com python2 e python3, tente o seguinte:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
Você está procurando por algo exatamente igual urllib.urlencode()
!
No entanto, quando você chama parse_qs()
(diferente de parse_qsl()
), as chaves de dicionário são os nomes de variáveis de consulta exclusivos e os valores são listas de valores para cada nome.
Para passar essas informações urllib.urlencode()
, você deve "nivelar" essas listas. Aqui está como você pode fazer isso com uma compreensão de lista de tuplas:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
.
Talvez você esteja procurando algo assim:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
Ele pega um dicionário e o converte em uma string de consulta, assim como o urlencode. Ele acrescentará um "&" final à string de consulta, mas return query[:-1]
corrigirá isso, se for um problema.
str.join()
? Que tal urllib.quote_plus()
?
urlencode
em urllib.py
(ele deve por em sua Python instalar) para ver por que a criação de uma cadeia de consulta, por vezes, não é tão simples como a sua resposta implica (em particular a necessidade de 'citação' determinados caracteres que não são válidas em um URL). @Ignacio também fez referência a duas funções que limpariam sua implementação e a tornariam correta.
from urllib.parse import urlencode; urlencode(your_dict)
) é mais curta e fácil do que esta! Admito que às vezes é inteligente reinventar a roda, mesmo de maneira inadequada, quando é caro ou inconveniente acessar as rodas existentes e bem projetadas, mas aqui usar a roda pronta é mais fácil e rápido do que girar a roda inferior .
cgi.parse_qs()
está obsoleto. Use urlparse.parse_qs () ao invés.