Python字典转URL参数

168

我正在尝试将Python字典转换为字符串以便用作URL参数。我相信有更好、更符合Pythonic的方式来实现这一点。那是什么呢?

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

318
使用urllib.parse.urlencode()函数。它接受一个键值对字典,并将其转换为适合URL的形式(例如,key1=val1&key2=val2)。
对于你的示例:
>>> import urllib.parse
>>> params = {'a':'A', 'b':'B'}
>>> urllib.parse.urlencode(params)
'a=A&b=B'

如果您想创建一个包含重复参数的URL,例如:p=1&p=2&p=3,您有两个选项:

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

或者:

>>> urllib.parse.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'

如果您还在使用Python 2,请使用urllib.urlencode()


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
7
获取重复参数的另一种方法是:使用urllib.urlencode({'p': [1, 2, 3]}, doseq=True),结果为'p=1&p=2&p=3'。注意保持内容原意并使其更易懂,不提供解释或额外内容。 - mbaechtold
如果你想知道doseq是什么意思:“如果查询参数中有任何值是序列并且doseq为真,则每个序列元素都会转换为单独的参数。” - Martin Thoma
8
Python3用户:urllib.parse.urlencode()。该函数用于将一个字典转换成URL编码的查询字符串。 - Olshansky

39

对于Python 3,urllib库有所改变,现在你需要执行:

from urllib.parse import urlencode


params = {'a':'A', 'b':'B'}

urlencode(params)

21

以下是在 Python 3 中正确使用它的方法。

from urllib.parse import urlencode
params = {'a':'A', 'b':'B'}
print(urlencode(params))

由于Python 2现已被弃用,我会接受这个答案,但是Stack Overflow阻止我更改已接受的答案。 - kzh
1
这与我一年前的答案有何不同? - Newskooler

3

使用第三方Python URL操纵库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'

我在哪里可以获取furl?它似乎不是标准库。 - AMADANON Inc.
1
pip install furl 不是标准库的一部分。 - Mayank Jaiswal

-10

这对我来说更像是 Python 风格,并且不使用其他模块:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])

19
这样做无法正确进行百分号编码,如果您的数据包含“&”、“=”、“#”等字符,会产生意想不到的结果。 - Jamie Cockburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接