【问题标题】:Python3 - parse_qs doesn't separate arguments as expectedPython3 - parse_qs 没有按预期分隔参数
【发布时间】:2018-02-05 21:02:23
【问题描述】:

我在 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 不是?我在哪里可以阅读有关该主题的内容?

【问题讨论】:

    标签: python python-3.x url urllib


    【解决方案1】:

    parse_qs() 需要只是查询字符串。你传入了一个完整的 URL。

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

    >>> 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() 分割第一个? 字符上的字符串,并将第一个字符之后的所有内容解析为查询字符串。

    【讨论】:

    • 谢谢!您能否稍微扩展一下您的第二段(为什么这是预期结果)?
    • @user9115052:这些值本身可能是 URL,但它们被正确引用以防止它们被意外解释为查询参数。
    • @user9115052:所以两个键中的每一个的每个值都是带有查询字符串的单独的部分 URL,如果首先转义,这些查询字符串只能是另一个查询字符串的一部分.
    • 哦,所以我的 url 包含两个查询参数,它们本身可能包含查询参数?
    • 我主要想从我的网址中删除/p/test-test-test-000761di。您能否指出正确的方向,如何正确提取这些信息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多