网址在Python中解码UTF-8


245

就我是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")) 返回的东西非常丑陋。

仍然没有解决方案,感谢您的帮助。


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

Answers:


397

该数据是UTF-8编码的字节逃脱URL引用,所以要解码,用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是+字符和+文字在解码期间被删除了吗?
AlexLordThorsen 2014年

5
@Rawrgulmuffins +x-www-form-urlencoded数据空间;您可能会使用urllib.parse.parse_qs()解析或使用urllib.parse.unquote_plus()。但是它们应该只出现在查询字符串中,而不出现在URL的其余部分中。
的Martijn Pieters的

140

如果您使用的是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上获取字典而不是查询字符串
Clocker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.