对值数组进行URL编码

49 投票
5 回答
49993 浏览
提问于 2025-04-15 21:11

我在用Python的urllib.urlencode来对一个字典进行URL编码,但我遇到了问题,因为我需要编码一个数组。

我想要的结果是:

criterias%5B%5D=member&criterias%5B%5D=issue
#unquoted: criterias[]=member&criterias[]=issue

但是我得到的结果却是:

criterias=%5B%27member%27%2C+%27issue%27%5D
#unquoted: criterias=['member',+'issue']

我尝试了好几种方法,但就是无法得到正确的结果。

import urllib
criterias = ['member', 'issue']
params = {
    'criterias[]': criterias,
}
print urllib.urlencode(params)

如果我用cgi.parse_qs来解码一个正确的查询字符串,我得到的结果是:

{'criterias[]': ['member', 'issue']}

但是如果我对这个结果进行编码,我又得到了错误的结果。有没有办法得到我想要的结果呢?

5 个回答

3

为了让这个功能可以适用于任何参数字典,并把它转换成一个元组列表:

import urllib

def url_encode_params(params={}):
    if not isinstance(params, dict): 
        raise Exception("You must pass in a dictionary!")
    params_list = []
    for k,v in params.items():
        if isinstance(v, list): params_list.extend([(k, x) for x in v])
        else: params_list.append((k, v))
    return urllib.urlencode(params_list)

这样做之后,它应该能同时适用于上面的例子,以及一个包含一些字符串和一些数组作为值的字典:

criterias = ['member', 'issue']
params = {
    'criterias[]': criterias,
}
url_encode_params(params)
>>'criterias%5B%5D=member&criterias%5B%5D=issue' 
12

你可以使用一组键值对(元组)来实现:

>>> urllib.urlencode([('criterias[]', 'member'), ('criterias[]', 'issue')])
'criterias%5B%5D=member&criterias%5B%5D=issue'
90

这个解决方案比上面提到的那些简单多了。

>>> import urllib
>>> params = {'criterias[]': ['member', 'issue']}
>>> 
>>> print urllib.urlencode(params, True)
criterias%5B%5D=member&criterias%5B%5D=issue

注意“True”这个值。可以查看http://docs.python.org/library/urllib.html#urllib.urlencode中的doseq变量。

顺便提一下,你并不需要用“[]”来让它当作数组使用(这就是为什么urllib不包含它)。这意味着你不需要在所有的数组键上加上“[]”。

撰写回答