【问题标题】:How to stop Python parse_qs from parsing single values into lists?如何阻止 Python parse_qs 将单个值解析为列表?
【发布时间】:2010-11-04 16:18:57
【问题描述】:

在python 2.6中,以下代码:

import urlparse
qsdata = "test=test&test2=test2&test2=test3"
qs = urlparse.parse_qs(qsdata)
print qs

给出以下输出:

{'test': ['test'], 'test2': ['test2', 'test3']}

这意味着即使只有一个 test 值,它仍然被解析成一个列表。有没有办法确保如果只有一个值,它不会被解析成一个列表,所以结果看起来像这样?

{'test': 'test', 'test2': ['test2', 'test3']}

【问题讨论】:

  • 所有值都是列表不是更一致,你不必担心它是一个列表还是单个值,你为什么要不然?
  • HTTP 标准意味着它必须是一个列表。似乎没有很多替代品。
  • 到目前为止我遇到的所有网址都类似于“https://www.example.com/api/v1/resource?queryA=1&queryB=2”。我不明白为什么 HTTP 标准坚持该值应该是一个“列表”。我认为一个字符串就足够了。谁能给我一个例子,好吗?

标签: python python-2.6


【解决方案1】:

你可以稍后修复它...

import urlparse
qsdata = "test=test&test2=test2&test2=test3"
qs = dict( (k, v if len(v)>1 else v[0] ) 
           for k, v in urlparse.parse_qs(qsdata).iteritems() )
print qs

但是,我不认为 会想要这个。如果一个通常是列表的参数碰巧只有一个项目集到达,那么我将有一个字符串而不是我通常收到的字符串列表。

【讨论】:

    【解决方案2】:

    对于只想要一个简单的字典并且从不需要具有相同键的多个值的人的旁注,请尝试:

    dict(urlparse.parse_qsl('foo=bar&baz=qux'))
    

    这会给你一个很好的{'foo': 'bar', 'baz': 'qux'}。请注意,如果同一键有多个值,您只会得到最后一个。

    【讨论】:

    • parse_qsl() 不是给你一个键值对列表(而不是一个字典)吗?
    • @MisterBhoot 是的,这就是为什么我有 dict(...) 电话围绕它。 :)
    • 我的错,对不起。我现在应该早点睡觉了。
    • 那行不通,它仍然是 query_params 到列表的字典
    【解决方案3】:

    扩展@SingleNegationElimination 的答案。如果你这样做,你只能使用查询参数的最后一个实例。

    from urllib.parse import parse_qs
    qsdata = "test=test&test2=test2&test2=test3"
    dict((k, v[-1] if isinstance(v, list) else v)
          for k, v in parse_qs(qsdata).items())
    
    # Returns: {'test': 'test', 'test2': 'test3'}
    

    或者您可以使用以下内容仅保留 url 参数的第一个实例:

    from urllib.parse import parse_qs
    qsdata = "test=test&test2=test2&test2=test3"
    dict((k, v[0] if isinstance(v, list) else v)
          for k, v in parse_qs(qsdata).items())
    
    # Returns: {'test': 'test', 'test2': 'test2'}
    

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多