Python3:不同字符集支持

1 投票
1 回答
640 浏览
提问于 2025-04-17 16:05

我在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源代码中根本不显示字符集!所以,我的应用程序在这种情况下就无法继续了!

我该如何自动检测字符集并根据它进行解码呢?如果可以的话,请详细讲解并给我一些例子。你也可以推荐一些重要的链接。

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:

  • 你在创建 soup 对象时传入的 fromEncoding 参数指定的编码。
  • 文档本身发现的编码:比如在 XML 声明中,或者在 HTML 文档中的 http-equiv META 标签。如果 Beautiful Soup 在文档中找到这种编码,它会从头开始重新解析文档,并尝试新的编码。唯一的例外是,如果你明确指定了一个编码,并且这个编码确实有效,那么它会忽略文档中找到的任何编码。
  • 通过查看文件的前几个字节来猜测的编码。如果在这个阶段检测到编码,它会是 UTF-* 编码、EBCDIC 或 ASCII。
  • 如果你安装了 chardet 库,它会通过这个库来猜测编码。
  • UTF-8
  • Windows-1252

这个解释在 BeautifulSoup 4 的文档中似乎没有,但可以推测 BS4 的 UnicodeDammit 工作原理大致相同(虽然我没有检查源代码来确认)。

撰写回答