urlencode一组值

时间:2010-04-03 11:41:54

标签: python http

我正在尝试使用urllib.urlencode对python中的字典进行urlencode。问题是,我必须编码一个数组。

结果必须是:

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 个答案:

答案 0 :(得分:67)

解决方案比上面列出的解决方案简单得多。

>>> 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不包括它)。这意味着您不需要将[]添加到所有数组键中。

答案 1 :(得分:11)

您可以使用键值对(元组)列表:

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

答案 2 :(得分:2)

Listcomp of values:

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

答案 3 :(得分:2)

要将其抽象出来以适用于任何参数字典并将其转换为元组列表:

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' 

答案 4 :(得分:0)

aws api定义其获取网址:params.0=foo&params.1=bar

但是,缺点是您需要编写代码自行编码和解码,结果是:params = [foo,bar]