如何阻止Python的parse_qs将单个值解析为列表?
在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
不过,我觉得我不想这样。如果一个通常应该是列表的参数,偏偏只传来了一个项目,那么我就会得到一个字符串,而不是我通常收到的一串字符串列表。