ChatGPT解决这个技术问题 Extra ChatGPT

网址在 Python 中解码 UTF-8

就我是 Python 的新手而言,我已经花了很多时间。我怎么能解码这样的 URL:

example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0

到 python 2.7 中的这个:example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) 正在返回一些非常丑陋的东西。

仍然没有解决方案,任何帮助表示赞赏。

在一般情况下,URL 的尾部只是一个 cookie。您不知道服务器使用哪种本地字符集编码,甚至不知道 URL 是否编码字符串或完全不同的东西。 (当然,许多 URL 确实对人类可读的字符串进行了编码;而且通常,您可以很容易地猜出编码。但在一般情况下或完全自动是不可能的。)

K
Keyur Potdar

数据是使用 URL 引用转义的 UTF-8 编码字节,因此您希望使用 urllib.parse.unquote() 解码,它可以透明地处理从百分比编码数据到 UTF-8 字节然后再到文本的解码:

from urllib.parse import unquote

url = unquote(url)

演示:

>>> from urllib.parse import unquote
>>> url = 'example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0'
>>> unquote(url)
'example.com?title=правовая+защита'

Python 2 的等价物是 urllib.unquote(),但这会返回一个字节串,因此您必须手动解码:

from urllib import unquote

url = unquote(url).decode('utf8')

那么为什么 + 字符会留在字符串中呢?我认为 %2B 是 + 字符并且 + 文字在解码过程中被删除了?
@Rawrgulmuffins +x-www-form-urlencoded data 中的一个空格;您可以使用 urllib.parse.parse_qs() 来解析它,或者使用 urllib.parse.unquote_plus()。但它们应该只出现在查询字符串中,而不是 URL 的其余部分。
M
Martin Thoma

如果您使用的是 Python 3,则可以使用 urllib.parse

url = """example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0"""

import urllib.parse
urllib.parse.unquote(url)

给出:

'example.com?title=правовая+защита'

使用它并在 python3.8 上获取字典而不是查询字符串
i
ivanleoncz

您也可以使用 requests 库实现预期结果:

import requests

url = "http://www.mywebsite.org/Data%20Set.zip"

print(f"Before: {url}")
print(f"After:  {requests.utils.unquote(url)}")

输出:

$ python3 test_url_unquote.py

Before: http://www.mywebsite.org/Data%20Set.zip
After:  http://www.mywebsite.org/Data Set.zip

如果您已经在使用 requests,而无需为此作业使用其他库,则可能会很方便。


也适用于 Python 2。
这只是 urllib.parsealias
你的这个评论增加了很多。非常感谢。
R
Roland Puntaier

在 HTML 中,URL 可以包含 html 实体。这也取代了它们。

#from urllib import unquote #earlier python version
from urllib.request import unquote
from html import unescape
unescape(unquote('https://v.w.xy/p1/p22?userId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&confirmationToken=7uAf%2fxJoxRTFAZdxslCn2uwVR9vV7cYrlHs%2fl9sU%2frix9f9CnVx8uUT%2bu8y1%2fWCs99INKDnfA2ayhGP1ZD0z%2bodXjK9xL5I4gjKR2xp7p8Sckvb04mddf%2fiG75QYiRevgqdMnvd9N5VZp2ksBc83lDg7%2fgxqIwktteSI9RA3Ux9VIiNxx%2fZLe9dZSHxRq9AA'))

html.unescape 是不必要的。
在我的计算机上没有 unescape 示例中的 & 不会转换为 &。我刚刚检查了 Python 3.9.7。
问题是关于解码 URL,而不是 HTML。