我在Windows 7中使用python 3.3。
if "iso-8859-1" in str(source):
source = source.decode('iso-8859-1')
if "utf-8" in str(source):
source = source.decode('utf-8')
所以,目前我的应用程序仅适用于上述两个字符集......但我想覆盖所有可能的字符集。
实际上,我是从网站的源代码手动找到这些字符集的,我体验到世界上所有的网站都不仅仅来自这两个网站。有时网站不会在他们的HTML源代码中显示他们的字符集!所以,我的应用程序无法继续前进!
如何自动检测字符集并根据它进行解码? 如果可能的话,请尽量让我深入了解并提供示例。您也可以建议重要的链接。
答案 0 :(得分:1)
BeautifulSoup提供了一个函数UnicodeDammit()
,它通过许多步骤 1 来确定您给它的任何字符串的编码,并将其转换为unicode。它非常简单易用:
from bs4 import UnicodeDammit
unicode_string = UnicodeDammit(encoded_string)
如果您使用BeautifulSoup处理HTML,它将automatically use UnicodeDammit将其转换为unicode。
1 According to the documentation for BeautifulSoup 3,这些是UnicodeDammit采取的行动:
美丽的汤按优先级顺序尝试以下编码 将您的文档转换为Unicode:
- 作为fromEncoding参数传递给汤构造函数的编码。
- 在文档本身中发现的编码:例如,在XML中 声明或(对于HTML文档)一个http-equiv META标记。如果美丽 Soup在文档中找到这种编码,它解析了 从头开始再次记录并尝试新的编码。该 唯一的例外是如果您明确指定了编码,那就是 编码实际工作:然后它将忽略它在中找到的任何编码 文档。
- 通过查看文件的前几个字节来嗅探编码。如果 在这个阶段检测到编码,它将是UTF- *编码之一, EBCDIC或ASCII。
- chardet库嗅探的编码(如果已安装)。
- UTF-8
- Windows的1252
这个解释似乎没有出现在BeautifulSoup 4文档中,但可能是BS4的UnicodeDammit以相同的方式工作(虽然我没有检查源代码以确定)。