问题
当使用 python 对网页进行屏幕抓取时,必须知道页面的字符编码。如果你得到错误的字符编码,那么你的输出就会被弄乱。
人们通常使用一些基本的技术来检测编码。它们要么使用标头中的字符集或元标记中定义的字符集,要么使用编码检测器(它不关心元标记或标头)。仅使用其中一种技术,有时您将无法获得与在浏览器中相同的结果。
浏览器这样做:
- 元标记始终优先(或 xml 定义)
- 当元标记中没有定义字符集时,使用标头中定义的编码
- 如果根本没有定义编码,那么就该进行编码检测了。
(嗯......至少我相信大多数浏览器都是这样做的。文档真的很稀缺。)
我正在寻找的是一个可以像浏览器一样决定页面字符集的库。我确信我不是第一个需要适当解决这个问题的人。
解决方案(我还没有尝试过......)
Beautiful Soup 按优先级顺序尝试以下编码,将您的文档转换为 Unicode:
- 您作为 fromEncoding 参数传递给汤构造函数的编码。
- 在文档本身中发现的编码:例如,在 XML 声明或(对于 HTML 文档)http-equiv META 标记中。如果 Beautiful Soup 在文档中发现这种编码,它会重新从头开始解析文档并尝试新的编码。唯一的例外是,如果您明确指定了编码,并且该编码确实有效:那么它将忽略它在文档中找到的任何编码。
- 通过查看文件的前几个字节来嗅探的编码。如果在此阶段检测到编码,它将是 UTF-* 编码、EBCDIC 或 ASCII 之一。
- chardet 库嗅探到的编码,如果您安装了它。
- UTF-8
- Windows-1252