1

我在 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 源代码中显示其字符集!所以,我的应用程序无法继续前进!

我应该怎么做才能自动检测字符集并根据它进行解码?如果可能,请尝试让我深入了解并提供示例。您也可以建议重要的链接。

4

1 回答 1

1

BeautifulSoup提供了一个函数,该函数UnicodeDammit()通过多个步骤1来确定您给它的任何字符串的编码,并将其转换为 unicode。使用起来非常简单:

from bs4 import UnicodeDammit
unicode_string = UnicodeDammit(encoded_string)

如果您使用 BeautifulSoup 处理您的 HTML,它会自动使用 UnicodeDammit为您将其转换为 unicode。


1根据 BeautifulSoup 3 的文档,这些是 UnicodeDammit 采取的行动:

Beautiful Soup 按优先级顺序尝试以下编码,将您的文档转换为 Unicode:

  • 您作为 fromEncoding 参数传递给汤构造函数的编码。
  • 在文档本身中发现的编码:例如,在 XML 声明或(对于 HTML 文档)http-equiv META 标记中。如果 Beautiful Soup 在文档中发现这种编码,它会重新从头开始解析文档并尝试新的编码。唯一的例外是,如果您明确指定了编码,并且该编码确实有效:那么它将忽略它在文档中找到的任何编码。
  • 通过查看文件的前几个字节来嗅探的编码。如果在此阶段检测到编码,它将是 UTF-* 编码、EBCDIC 或 ASCII 之一。
  • chardet 库嗅探到的编码,如果您安装了它。
  • UTF-8
  • Windows-1252

BeautifulSoup 4 文档中似乎没有这种解释,但大概 BS4 的 UnicodeDammit 以大致相同的方式工作(尽管我没有检查源以确定)。

于 2013-02-16T16:13:52.673 回答