Python Dictionary a los parámetros de URL

124

Estoy tratando de convertir un diccionario de Python en una cadena para usar como parámetros de URL. Estoy seguro de que hay una manera mejor y más pitónica de hacerlo. ¿Qué es?

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

Respuestas:

252

Uso urllib.urlencode(). Toma un diccionario de pares clave-valor y lo convierte en un formulario adecuado para una URL (por ejemplo, key1=val1&key2=val2).

Si está utilizando Python3, use urllib.parse.urlencode()

Si desea crear una URL con parámetros repetitivos como: p=1&p=2&p=3tiene dos opciones:

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

o si quieres hacer una url con parámetros repetitivos:

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'
mipadi
fuente
44
si desea hacer una url con parámetros repetitivos, por ejemplo:? p = 1 & p = 2 & p = 3 entonces a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) el resultado es 'p = 1 & p = 2 & p = 3'
panchicore
66
Otra forma de obtener parámetros repetitivos: urllib.urlencode ({'p': [1, 2, 3]}, doseq = True) que da como resultado 'p = 1 & p = 2 & p = 3'.
mbaechtold
Si se pregunta de qué doeseqse trata: "Si alguno de los valores en la consulta arg son secuencias y doseq es verdadero, cada elemento de secuencia se convierte en un parámetro separado".
Martin Thoma
2

Utilice la biblioteca de manipulación de URL de Python de terceros furl :

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

Si desea parámetros repetitivos, puede hacer lo siguiente:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'
Mayank Jaiswal
fuente
¿Dónde consigo furl? Parece que no es una biblioteca estándar
AMADANON Inc.
1
pip install furlNo es parte de la biblioteca estándar
Mayank Jaiswal
-7

Esto me parece un poco más Pythonic, y no usa ningún otro módulo:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])
Tao Starbow
fuente
8
Esto no codificará por ciento los parámetros correctamente. Esto creará resultados inesperados si sus datos incluyen símbolos de unión, iguales, símbolos de patata, etc.
Jamie Cockburn