Python 漂亮的汤默认解码字符集?

Python 漂亮的汤默认解码字符集?,python,encoding,utf-8,character-encoding,beautifulsoup,Python,Encoding,Utf 8,Character Encoding,Beautifulsoup,我有一大堆不同编码的网页,我试着用BeautifulSoup解析它们 正如我所注意到的,BS使用元字符集或xml编码标记检测编码。但有些文档的字符集名称中没有这样的标记或拼写错误,而BS在所有这些文档上都失败了。我想它的默认猜测是utf-8,这是错误的。幸运的是,所有这些页面(或几乎所有页面)都有相同的编码。有没有办法将其设置为默认值 我还尝试grep字符集并首先使用iconv到utf8-它工作得很好,并提供完全可读的utf-8编码输出,但是BSBeautifulSoup(sys.stdin.r

我有一大堆不同编码的网页,我试着用BeautifulSoup解析它们

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

我还尝试grep字符集并首先使用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是混乱的。它在这里的行为真的很奇怪-当我删除一个或另一个随机字符(如“-”或“*”等-不是任何邪恶的奇怪字符)时,它工作得很顺利-所以我放弃了它,我真的希望继续进行本地美丽的汤解码,不过它也快了一点。

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

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

soup = BeautifulSoup(source, from_encoding=codec)
您可以在此使用异常处理仅在解码失败时应用手动编解码器:

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

另请参阅BeautifulSoup文档的第页。

问题是,我只需要为文档>>使用默认编码,在字符集名称中没有此类标记或键入;据我所知,“from_encoding=codec”迫使BS始终使用该编解码器。@user3702700:这就是异常处理的作用。谢谢你的帮助,这对我来说非常有价值。但不幸的是,在这种情况下没有抛出异常。现在,我在dammit.py中修改了“作为最后手段”和“作为绝对最后手段”部分的编码列表。有utf-8和windows-1252,所以最后的猜测是windows-1252,这是错误的。但是,在不修改源代码的情况下实现这一点更可取。没有通用的解决方案来识别标记错误的字符集。一些工具,如
chardet
做得相当不错,但最终总会有一些邪恶的天才找到一种方法来放置错误的标签,只有手动检查、努力工作和大量猜测是唯一的解决办法。@tripleee一个更邪恶的天才会将不同的编码组合到一个文档中。那就别无选择了。