Dictionnaire Python vers les paramètres d'URL

124

J'essaie de convertir un dictionnaire Python en une chaîne à utiliser comme paramètres d'URL. Je suis sûr qu'il existe une meilleure façon, plus pythonique , de faire cela. Qu'Est-ce que c'est?

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

Réponses:

252

Utilisez urllib.urlencode(). Il prend un dictionnaire de paires clé-valeur, et le convertit sous une forme adaptée à une URL (par exemple, key1=val1&key2=val2).

Si vous utilisez Python3, utilisez urllib.parse.urlencode()

Si vous souhaitez créer une URL avec des paramètres répétitifs tels que: p=1&p=2&p=3vous avez deux options:

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

ou si vous souhaitez créer une URL avec des paramètres répétitifs:

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'
mipadi
la source
4
si vous souhaitez créer une URL avec des paramètres répétitifs par exemple:? p = 1 & p = 2 & p = 3 alors a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) le résultat est 'p = 1 & p = 2 & p = 3'
panchicore
6
Une autre façon d'obtenir des paramètres répétitifs: urllib.urlencode ({'p': [1, 2, 3]}, doseq = True) résultant en 'p = 1 & p = 2 & p = 3'.
mbaechtold
Si vous vous demandez de quoi il doeseqs'agit: "Si des valeurs de la requête arg sont des séquences et que doseq est vraie, chaque élément de séquence est converti en un paramètre distinct."
Martin Thoma le
2

Utilisez la bibliothèque tierce de manipulation d'url Python furl :

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

Si vous souhaitez des paramètres répétitifs, vous pouvez effectuer les opérations suivantes:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'
Mayank Jaiswal
la source
Où puis-je obtenir un furl? Il ne semble pas être une bibliothèque standard
AMADANON Inc.
1
pip install furlCe ne fait pas partie de la bibliothèque standard
Mayank Jaiswal
-7

Cela me semble un peu plus pythonique et n'utilise aucun autre module:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])
Arc étoilé de Tao
la source
8
Cela n'encodera pas correctement les paramètres. Cela créera des résultats inattendus si vos données incluent des esperluettes, des égaux, des symboles de hachage, etc.
Jamie Cockburn