Python 如何处理`;`使用“urllib.parse.parse_qsl()”?

Python 如何处理`;`使用“urllib.parse.parse_qsl()”?,python,python-3.x,urllib,Python,Python 3.x,Urllib,不能由parse_qsl()处理。有没有办法让它知道?谢谢 >>> import urllib.parse >>> urllib.parse.parse_qsl('http://example.com/?q=abc&p=1;2;3') [('http://example.com/?q', 'abc'), ('p', '1')] 最好确保您正在处理的URL具有分号URL编码。e、 g.http://example.com/?q=abc&p=1%3B2%

不能由
parse_qsl()
处理。有没有办法让它知道
?谢谢

>>> import urllib.parse
>>> urllib.parse.parse_qsl('http://example.com/?q=abc&p=1;2;3')
[('http://example.com/?q', 'abc'), ('p', '1')]

最好确保您正在处理的URL具有分号URL编码。e、 g.
http://example.com/?q=abc&p=1%3B2%3B3

如果出于某种原因,您不能执行上述操作,您可以执行以下操作:

从urllib.parse导入urlparse,unquote\u plus
url=”http://example.com/?q=abc&p=1;2;3"
parts=urlparse(url)
qs=parts.query
pairs=[p.split(“=”,1)表示qs.split(“&”)中的p
解码=[(k,v)成对的(k,v)的(unquote_plus(k),unquote_plus(v)]]

上面的代码假设了查询字符串的一些情况。e、 g.所有键都有值。如果您想要一些假设较少的东西,请参阅。

实际上,它确实正确地对待它们(作为分隔符)。您只需告诉它保留空白值:

>>> urllib.parse.parse_qsl('q=abc&p=1;2;3', keep_blank_values=True)
[('q', 'abc'), ('p', '1'), ('2', ''), ('3', '')]

请注意,您不应该将整个url传递给
parseqsl
,而只传递查询字符串部分。

基本上,您(或者在本例中是
urllib.parse.parseqsl()
)应该在url中处理“;”like“&”。因此
urllib
查看URL的方式与查看
http://example.com/?q=abc&p=1&2&3
。如果可以,您应该在URL中对分号进行如下编码:
http://example.com/?q=abc&p=1%3B2%3B3
或用逗号而不是分号分隔数字。如果不控制URL,则可能必须自己解析查询字符串。你能把完整的答案贴出来作为答案吗?谢谢。我觉得这个案子,1;2.3都是p的值。不,不正确。因此,查询字符串应该看起来像
q=abc&p=1%3B2%3B3
,如果您收到一个未编码的查询字符串,那么您在其他地方会遇到一些问题,需要在那里解决它(否则最终会出现双重解码错误)。分号在RFC 1738保留字符(“;”、“/”、“?”、“:”、“@'、“=”和“&”)中所以需要在查询字符串中进行URL编码。我不是说RFC。我说的是一个具体的例子。显然,我的示例所派生的网站并不遵循此RFC。查询字符串是从客户端接收的数据。当客户端发送格式不正确的请求时,您应该将其发送回400响应。不要绕过它并尝试解析损坏的数据。
>>> urllib.parse.parse_qsl('q=abc&p=1;2;3', keep_blank_values=True)
[('q', 'abc'), ('p', '1'), ('2', ''), ('3', '')]