代码之家  ›  专栏  ›  技术社区  ›  Ikke

urlencode值数组

  •  38
  • Ikke  · 技术社区  · 16 年前

    我正试图用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']}
    

    但如果我对结果进行编码,我会得到一个错误的结果。有办法产生预期的结果吗?

    4 回复  |  直到 14 年前
        1
  •  65
  •   CSTobey    14 年前

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

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

    注意事实。见 http://docs.python.org/library/urllib.html#urllib.urlencode DOSEQ变量。

    顺便说一下,您不需要使用[]使其作为数组工作(这就是为什么urllib不包含它)。这意味着您不需要将[]添加到所有数组键。

        2
  •  11
  •   LukáÅ¡ Lalinský    16 年前

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

    >>> urllib.urlencode([('criterias[]', 'member'), ('criterias[]', 'issue')])
    'criterias%5B%5D=member&criterias%5B%5D=issue'
    
        3
  •  2
  •   gimel    16 年前

    值列表:

    >>> criterias = ['member', 'issue']
    >>> urllib.urlencode([('criterias[]', i) for i in criterias])
    'criterias%5B%5D=member&criterias%5B%5D=issue'
    >>> 
    
        4
  •  2
  •   David    15 年前

    要将其抽象出来以适用于任何参数字典并将其转换为元组列表,请执行以下操作:

    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'