Python3 - parse_qs不会按预期分隔参数

时间:2018-02-05 21:02:24

标签: python python-3.x url urllib

我在Python3中使用urllib - 库。代码:

from urllib.parse import parse_qs
parse_qs('https://www.example.com/?api-url=%2Fp%2Ftest-test-test-000761di%3Fajax%3Dtrue&api-params=%3Ft%3Dst-fs%26tc%3Dtrue')

返回字典:

{
  'https://www.example.com/?api-url': ['/p/test-test-test-000761di?ajax=true'], 
  'api-params': ['?t=st-fs&tc=true']
}

有人可以向我解释字典是如何构建的吗?

为什么...?api-url&api-params是关键,但?ajax?t&tc不是?我在哪里可以阅读这个主题?

1 个答案:

答案 0 :(得分:1)

parse_qs()期望只是查询字符串。你传了一个完整的网址。

如果只传入查询字符串,则会得到:

>>> parse_qs('api-url=%2Fp%2Ftest-test-test-000761di%3Fajax%3Dtrue&api-params=%3Ft%3Dst-fs%26tc%3Dtrue')
{'api-url': ['/p/test-test-test-000761di?ajax=true'], 'api-params': ['?t=st-fs&tc=true']}

这是给定查询字符串的正确结果;您在输出中看到的?=&字符在输入查询字符串中转义

例如,api-params的转义值为%3Ft%3Dst-fs%26tc%3Dtrue;正确的解释是该字符串的未加引号的值,即'?t=st-fs&tc=true'

然后您可以再次解析这些值,以删除第二层查询字符串语法,但您必须解析查询字符串:

>>> parsed['api-url'][0].partition('?')[-1]
'ajax=true'
>>> parse_qs(parsed['api-url'][0].partition('?')[-1])
{'ajax': ['true']}
>>> parsed['api-params'][0].partition('?')[-1]
't=st-fs&tc=true'
>>> parse_qs(parsed['api-params'][0].partition('?')[-1])
{'t': ['st-fs'], 'tc': ['true']}

我使用str.partition()来分割第一个?字符上的字符串,并在第一个字符被解析为查询字符串之后获取所有内容。