美丽的汤默认解码字符集?

时间:2015-03-25 12:05:59

标签: python encoding utf-8 character-encoding beautifulsoup

我有一组包含不同编码的网页,我尝试使用Beautiful Soup解析它。

正如我所注意到的,BS使用meta-charset或xml-encoding标签检测编码。但是有些文件在charset名称中没有这样的标签或拼写错误 - 而BS在所有这些文件中都失败了。我想它的默认猜测是utf-8,这是错误的。幸运的是,所有这些页面(或几乎所有这些页面)都具有相同的编码。有没有办法将其设置为默认值?

我也试过grep charset并首先使用iconv来使用utf8 - 它工作得很好,并提供完全可读的utf-8编码输出,但有时候BS BeautifulSoup(sys.stdin.read())(很少,如所有文件的0.05%)

随机失败
UnicodeDecodeError: 'utf8' codec can't decode byte *** in position ***: invalid start byte

在我看来,这里的基本原因是,虽然实际编码已经是utf-8,但元标记仍然表示前一个,因此BS很困惑。这里有一些非常奇怪的行为 - 比如当我删除一个或另一个随机字符(比如' - '或'*'等 - 而不是任何邪恶的怪物)时它会顺利运行 - 所以我放弃了它,我真的希望继续使用原生的Beautiful Soup解码,同时它也快一点。

1 个答案:

答案 0 :(得分:1)

BeautifulSoup确实会使用字符检测库进行有根据的猜测。那个过程可能错了;只删除一个字符确实可以从根本上改变某些类型文档的结果。

您可以通过指定输入编解码器来覆盖此猜测:

soup = BeautifulSoup(source, from_encoding=codec)

您可以在此处使用异常处理,仅在解码失败时应用手动编解码器:

try:
    soup = BeautifulSoup(source)
except UnicodeDecodeError:
    soup = BeautifulSoup(source, from_encoding=codec)

另请参阅BeautifulSoup文档的Encodings section