网址在 Python 中解码 UTF-8
Posted
技术标签:
【中文标题】网址在 Python 中解码 UTF-8【英文标题】:Url decode UTF-8 in Python 【发布时间】:2013-05-10 02:02:40 【问题描述】:作为 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确实 编码人类可读的字符串;通常,您可以很容易地猜出编码。但在一般情况下或完全自动是不可能的。) 【参考方案1】:数据是使用 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 的其余部分。【参考方案2】:
如果您使用的是 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 上使用这个并获取一个字典而不是查询字符串【参考方案3】:您也可以使用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。【参考方案4】:在 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。以上是关于网址在 Python 中解码 UTF-8的主要内容,如果未能解决你的问题,请参考以下文章
当对短网址使用唯一的字母数字字符串时,将创建的字符串存储在数据库中还是即时编码/解码更好?