如何阻止Python的parse_qs将单个值解析为列表?

67 投票
3 回答
33560 浏览
提问于 2025-04-15 12:24

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

3 个回答

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'}

或者,你也可以只保留网址参数的第一个实例,方法如下:

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'}
172

如果你只是想要一个简单的字典,而且不需要同一个键对应多个值,可以试试这个:

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

这样你就能得到一个像 {'foo': 'bar', 'baz': 'qux'} 这样的字典。请注意,如果同一个键有多个值,你只会得到最后一个值。

31

你可以在之后修复这个问题...

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

不过,我觉得我不想这样。如果一个通常应该是列表的参数,偏偏只传来了一个项目,那么我就会得到一个字符串,而不是我通常收到的一串字符串列表。

撰写回答