【问题标题】:urlencode an array of valuesurlencode 值数组
【发布时间】:2010-04-03 11:41:54
【问题描述】:

我正在尝试使用 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']}

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

【问题讨论】:

  • cig.parse_qs 已弃用(仅为了向后兼容而保留),因此使用urlparse.parse_qs 可能会更好
  • 感谢您的提示。我只是用来比较,所以没有真正用过。

标签: python http


【解决方案1】:

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

>>> 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.urlencodedoseq 变量。

附带说明,您不需要 [] 就可以将其用作数组(这就是 urllib 不包含它的原因)。这意味着您不需要将 [] 添加到所有数组键中。

【讨论】:

  • 如果不加[],php只会使用criterias=issue,会忽略"member"
  • 另请参阅此问题的答案:stackoverflow.com/questions/6243051/…
  • 澄清一下,Python 不在乎[] 是否存在:无论如何它都会正确转换它。但是,是的,PHP(也许还有其他语言?)确实在乎,所以如果您对此类系统有外部依赖,最好保留 [] 的...它在 Python 中看起来很奇怪。
  • 太棒了。我确定这会很困难!
  • 在 Python 3 中,urllib 模块已被分解,urlencode 条目位于 parse 子模块中。文档现在位于:docs.python.org/3/library/…
【解决方案2】:

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

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

【讨论】:

  • 嗯,写一个函数将带有列表的字典转换为元组列表非常容易。
  • 只是给其他人的注释,要直接从常规字典生成 urlencoded 字符串,您需要做的就是urllib.urlencode(d.items())
  • 你甚至不需要这样做,urllib.urlencode(d) 应该可以正常工作。
【解决方案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' 

【讨论】:

    【解决方案4】:

    值的列表组合:

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

    【讨论】:

      【解决方案5】:

      因为 aws api 定义了它的 get url:params.0=foo&params.1=bar

      不过,缺点是需要自己编写代码进行编码和解码,结果是:params=[foo, bar]

      【讨论】:

      • 这个答案今天救了我的命:D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2016-06-23
      • 2010-11-03
      • 2011-09-10
      • 2013-04-16
      相关资源
      最近更新 更多