UTF-8编码中一个字符的编码问题

3

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

r = requests.get(url)

soup = BeautifulSoup(r.text)

没有足够的信息来回答你的问题。如何判断它是如何变成 "®" 的?也许只是我们的输出有问题? - ofrommel
当我打印字符串时,在终端中会得到那个字符。 - Mazzy
你是如何将页面加载到BeautifulSoup中的?在某个地方它被解码为Latin1而不是UTF-8。PEP263注释仅适用于您的源代码,而不适用于您加载的任何其他数据。 - Martijn Pieters
我使用requests对象。我正在更新代码。 - Mazzy
1个回答

6

不要使用r.text,将解码留给BeautifulSoup

soup = BeautifulSoup(r.content)

r.content提供了未解码的字节响应。而r.text则是将响应解码为unicode

问题在于服务器没有在响应标头中包含字符集。此时,requests遵循HTTP RFC 2261,第3.7.1节:默认情况下,text/响应应使用ISO-8859-1(Latin 1)字符集。

对于您的HTML页面,这个默认值是错误的,导致您得到了不正确的结果;r.text将字节解码为Latin-1,导致出现了Mojibake

>>> print u'®'.encode('utf8').decode('latin1')
®

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接