Dicionário Python para parâmetros de URL

124

Estou tentando converter um dicionário Python em uma seqüência de caracteres para uso como parâmetros de URL. Estou certo de que existe uma maneira melhor e mais pitônica de fazer isso. O que é isso?

x = ""
for key, val in {'a':'A', 'b':'B'}.items():
    x += "%s=%s&" %(key,val)
x = x[:-1]
kzh
fonte

Respostas:

252

Use urllib.urlencode(). Ele pega um dicionário de pares de valores-chave e o converte em um formato adequado para um URL (por exemplo, key1=val1&key2=val2).

Se você estiver usando Python3, use urllib.parse.urlencode()

Se você deseja criar um URL com parâmetros repetitivos, como: p=1&p=2&p=3você tem duas opções:

>>> import urllib
>>> a = (('p',1),('p',2), ('p', 3))
>>> urllib.urlencode(a)
'p=1&p=2&p=3'

ou se você deseja criar um URL com parâmetros repetitivos:

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'
mipadi
fonte
4
se você deseja criar um URL com parâmetros repetitivos, por exemplo:? p = 1 & p = 2 & p = 3, então a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) o resultado é 'p = 1 & p = 2 & p = 3'
panchicore
6
Outra maneira de obter parâmetros repetitivos: urllib.urlencode ({'p': [1, 2, 3]}, doseq = True) resultando em 'p = 1 & p = 2 & p = 3'.
mbaechtold
Se você se perguntar o que doeseqé isso : "Se algum valor no argumento de consulta for sequências e doseq for verdadeira, cada elemento da sequência será convertido em um parâmetro separado."
Martin Thoma
2

Use a biblioteca de manipulação de URL Python de terceiros furl :

f = furl.furl('')
f.args = {'a':'A', 'b':'B'}
print(f.url) # prints ... '?a=A&b=B'

Se você deseja parâmetros repetitivos, pode fazer o seguinte:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'
Mayank Jaiswal
fonte
Onde eu fico peludo? Parece não ser uma biblioteca padrão
AMADANON Inc. 27/03
1
pip install furlA sua não é uma parte da biblioteca padrão
Mayank Jaiswal
-7

Isso me parece um pouco mais Pythonic e não usa outros módulos:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])
Tao Starbow
fonte
8
Isso não codifica por cento os parâmetros corretamente. Isto irá criar resultados inesperados se os seus dados inclui ampersands, iguais, símbolos de hash, etc.
Jamie Cockburn