网址在 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的主要内容,如果未能解决你的问题,请参考以下文章

JWT在线解码网址和结构介绍

求助,解释下Java中怎样把网址URL编码转义

当对短网址使用唯一的字母数字字符串时,将创建的字符串存储在数据库中还是即时编码/解码更好?

处理python字符串中的中文字符

Python:爬虫之利用Python获取指定网址上的所有图片—Jaosn niu

在phonegap中启动时打开网址