我在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
不是?我在哪里可以阅读这个主题?
答案 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()
来分割第一个?
字符上的字符串,并在第一个字符被解析为查询字符串之后获取所有内容。