Словарь Python для параметров URL

124

Я пытаюсь преобразовать словарь Python в строку для использования в качестве параметров URL. Я уверен, что есть лучший, более питонический способ сделать это. Что это?

x = ""
for key, val in {'a':'A', 'b':'B'}.items():
    x += "%s=%s&" %(key,val)
x = x[:-1]
КЖ
источник

Ответы:

252

Используйте urllib.urlencode(). Он берет словарь пар ключ-значение и преобразует его в форму, подходящую для URL-адреса (например, key1=val1&key2=val2).

Если вы используете Python3, используйте urllib.parse.urlencode()

Если вы хотите создать URL-адрес с повторяющимися параметрами, такими как: у p=1&p=2&p=3вас есть два варианта:

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

или если вы хотите создать URL-адрес с повторяющимися параметрами:

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'
mipadi
источник
4
если вы хотите создать URL-адрес с повторяющимися параметрами, например:? p = 1 & p = 2 & p = 3, тогда a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) результат будет 'p = 1 & p = 2 & p = 3'
panchicore
6
Другой способ получить повторяющиеся параметры: urllib.urlencode ({'p': [1, 2, 3]}, доза q = True), что приводит к 'p = 1 & p = 2 & p = 3'.
mbaechtold
Если вам интересно, о чем doeseqидет речь: «Если какие-либо значения в запросе arg являются последовательностями, а доза - истиной, каждый элемент последовательности преобразуется в отдельный параметр».
Мартин Тома,
2

Используйте стороннюю библиотеку управления URL- адресами Python Furl :

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

Если вам нужны повторяющиеся параметры, вы можете сделать следующее:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'
Майанк Джайсвал
источник
Где взять фурл? Похоже, это не стандартная библиотека
AMADANON Inc.
1
pip install furlЭто не часть стандартной библиотеки
Mayank
-7

Мне это кажется немного более Pythonic и не использует никаких других модулей:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])
Тао Старбоу
источник
8
Это не будет правильно кодировать параметры. Это приведет к неожиданным результатам, если ваши данные включают амперсанды, равенства, хеш-символы и т. Д.
Джейми Кокберн,