Beautiful Soup默认解码字符集



我有一大堆不同编码的网页,我试图用Beautiful Soup解析它。

正如我所注意到的,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很困惑。它在这里有非常奇怪的行为,比如当我删除一个或另一个随机字符(比如"-"或"*"等,而不是任何邪恶的奇怪字符)时,它会很顺利地工作,所以我放弃了它,我真的希望继续进行原生的Beautiful Soup解码,同时它也会更快一点。

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

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

soup = BeautifulSoup(source, from_encoding=codec)

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

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

另请参阅BeautifulSoup文档的编码部分。

最新更新