utf-8 字符的编码问题

Maz*_*zzy 3 python beautifulsoup utf-8 mojibake python-requests

我通过使用漂亮的汤库从网页上获得了一个链接a.get('href')。在链接中有一个奇怪的字符,®但是当我得到它时变成了®. 如何正确编码?我已经在页面开头添加了# -*- coding: utf-8 -*-

r = requests.get(url)

soup = BeautifulSoup(r.text)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

千万不能使用r.text; 将解码留给BeautifulSoup

soup = BeautifulSoup(r.content)
Run Code Online (Sandbox Code Playgroud)

r.content以字节为单位为您提供响应,无需解码。r.text另一方面,是解码为 的响应unicode

发生的情况是服务器没有在响应头中包含字符集。那时,requests遵循HTTP RFC 2261 第 3.7.1 节默认情况下text/响应应使用 ISO-8859-1(拉丁文 1)字符集。

对于您的 HTML 页面,该默认值是错误的,并且您得到了错误的结果;r.text将字节解码为 Latin-1,产生一个Mojibake

>>> print u'®'.encode('utf8').decode('latin1')
®
Run Code Online (Sandbox Code Playgroud)

HTML 本身可以在 HTML 页面本身中以 HTML 标头中的<meta>标记形式包含正确的编码。BeautifulSoup 将使用该标头并为您解码字节。

即使<meta>缺少标头标记,BeautifulSoup 也包含其他方法来自动检测编码