最简单的方法可能是解析页面两次,一次为 UTF-8,一次为 GB2312。然后从 GB2312 解析中提取相关部分。
我对 GB2312 了解不多,但查找它似乎至少与基本字母、数字等上的 ASCII 一致。所以你应该仍然能够使用 GB2312 解析 HTML 结构,希望能给你足够的信息以提取您需要的部分。
实际上,这可能是唯一的方法。一般来说,GB2312 编码的文本不是有效的 UTF-8,因此尝试将其解码为 UTF-8 会导致错误。BeautifulSoup 文档说:
在极少数情况下(通常当 UTF-8 文档包含以完全不同的编码编写的文本时),获得 Unicode 的唯一方法可能是将某些字符替换为特殊的 Unicode 字符“REPLACEMENT CHARACTER”(U+FFFD,�)。如果 Unicode,Dammit 需要这样做,它会将 UnicodeDammit 或 BeautifulSoup 对象上的 .contains_replacement_characters 属性设置为 True。
这听起来像是 BeautifulSoup 只是忽略了解码错误并用 U+FFFD 替换了错误的字符。如果是这种情况(即,如果您的文档有contains_replacement_characters == True
),那么一旦将原始数据解码为 UTF-8,就无法从文档中取回原始数据。您将不得不执行我上面建议的操作,使用不同的编解码器对整个文档进行两次解码。