就我是 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 引用转义的 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')
如果您使用的是 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=правовая+защита'
您也可以使用 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
,而无需为此作业使用其他库,则可能会很方便。
在 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。
不定期副业成功案例分享
+
是x-www-form-urlencoded
data 中的一个空格;您可以使用urllib.parse.parse_qs()
来解析它,或者使用urllib.parse.unquote_plus()
。但它们应该只出现在查询字符串中,而不是 URL 的其余部分。