如何用 `urllib.parse.parse_qsl()` 处理 `;`?
How to deal with `;` with `urllib.parse.parse_qsl()`?
;
无法被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 编码。例如http://example.com/?q=abc&p=1%3B2%3B3
如果由于某种原因您不能执行上述操作,您可以这样做:
from urllib.parse import urlparse, unquote_plus
url = "http://example.com/?q=abc&p=1;2;3"
parts = urlparse(url)
qs = parts.query
pairs = [p.split("=", 1) for p in qs.split("&")]
decoded = [(unquote_plus(k), unquote_plus(v)) for (k, v) in pairs]
>>> decoded
[('q', 'abc'), ('p', '1;2;3')]
上面的代码假设了一些关于查询字符串的事情。例如所有键都有值。如果您想要更少假设的内容,请参阅 parse_qsl
source code.
实际上,它确实正确对待它们(作为分隔符)。你只需要告诉它保留空白值:
>>> urllib.parse.parse_qsl('q=abc&p=1;2;3', keep_blank_values=True)
[('q', 'abc'), ('p', '1'), ('2', ''), ('3', '')]
请注意,您不应将整个 url 传递给 parse_qsl
,只传递查询字符串部分。
;
无法被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 编码。例如http://example.com/?q=abc&p=1%3B2%3B3
如果由于某种原因您不能执行上述操作,您可以这样做:
from urllib.parse import urlparse, unquote_plus
url = "http://example.com/?q=abc&p=1;2;3"
parts = urlparse(url)
qs = parts.query
pairs = [p.split("=", 1) for p in qs.split("&")]
decoded = [(unquote_plus(k), unquote_plus(v)) for (k, v) in pairs]
>>> decoded
[('q', 'abc'), ('p', '1;2;3')]
上面的代码假设了一些关于查询字符串的事情。例如所有键都有值。如果您想要更少假设的内容,请参阅 parse_qsl
source code.
实际上,它确实正确对待它们(作为分隔符)。你只需要告诉它保留空白值:
>>> urllib.parse.parse_qsl('q=abc&p=1;2;3', keep_blank_values=True)
[('q', 'abc'), ('p', '1'), ('2', ''), ('3', '')]
请注意,您不应将整个 url 传递给 parse_qsl
,只传递查询字符串部分。