Python编码问题:度数符号和其他符号

4
我正在使用BeautifulSoup从网页中抓取数据。我想将网站数据与 .txt 文档中的文本进行比较。然而,我似乎遇到了编码问题。
该网站上有文本“heat oven to 400°”。该文本也在“查看源代码”中以此方式显示(没有html实体)。
使用BeautifulSoup读取该网站:
source = "my url".read()
....
soup = BeautifulSoup(source)    

这个文本文档是通过创建一个新的文本文档并将其编码为“UTF-8无BOM”来创建的。然后,我从网站上复制并粘贴了“将烤箱加热到400度”的内容到文本文档中,并保存。

该文本文件被读取为:

f = codecs.open('myfilename', encoding='utf-8')

当我比较这两个字符串时,它们不相等,但我希望它们相等。

为了查看发生了什么:在Eclipse中,我拆分了这两个文本,并在调试模式下查看变量,发现BeautifulSoup的度符号显示为\xc2 \xb0。而文本文档中的度符号只显示为\xb0。

为什么会这样,我该如何解决?我遇到了许多特殊字符的问题,因此需要一个通用解决方案。另外,我将从几个网站复制粘贴数据到文本文档中。


http://stackoverflow.com/search?q=[python]+beautifulsoup+encoding - Ignacio Vazquez-Abrams
您知道文本文件的编码并且适当地使用它,但是网站的编码没有被考虑进去。基本上,只有在相同的编码下比较字节才有意义(就像您现在所做的),或者比较Unicode字符串(需要使用正确的编码将字节进行解释)。 - Cameron
您的文本文档似乎不是UTF-8格式,尽管您已经尝试过。或者HTML以某种方式进行了双重编码(如果您仍然想添加信息,文件的简单十六进制转储将有所帮助,但目前还不清楚您如何诊断差异)。 - tripleee
好的,问题解决了。像Cameron建议的那样,我再次查看了网站的编码方式。BeautifulSoup会自动考虑编码方式,将所有内容正确地转换为Unicode编码。我通过执行“print soup.originalEncoding”来验证这一点。当我直接从源代码创建soup时,它是UTF-8编码。但是,在从源代码创建soup之前,我使用re.sub()进行了一些文本替换。这就是改变源代码的UTF-8编码使BeautifulSoup无法识别的原因。所以我会检查一下我的文本替换方式。谢谢。 - user984003
1个回答

1

看起来Beautiful Soup没有正确检测编码所需的内容。你可以通过将BeautifulSoup(source)替换为BeautifulSoup(source, fromEncoding='UTF-8')来给出一个提示。更多选项和信息可以在“Beautiful Soup Gives You Unicode, Dammit”上找到。

当Unicode代码点U+00B0的UTF-8编码被错误地认为是Beautiful Soup对编码的最后猜测(即Windows 1252)时,得到的字节'\xc2\xb0'。


是的,谢谢,这基本上就是问题所在,但有一个小变化。我在创建soup之前修改了源代码。Beautiful Soup不再识别编码。请参见我的评论,以“好的,我弄清楚了”开头。 - user984003

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