55

在 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']}
4

3 回答 3

160

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

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

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

于 2011-11-23T08:35:34.670 回答
27

以后可以修...

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

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

于 2009-06-21T15:35:11.600 回答
0

扩展@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-10-20T17:26:01.807 回答