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=valuepares separados por'&'caracteres ...
dictretornado por cgi.parse_qs()realmente tem lists 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()?
urlencodeem 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.