使用Python从HTML元标签中确定字符集

1 投票
2 回答
1469 浏览
提问于 2025-04-16 11:51

我有一个脚本,需要在用lxml.HTML()解析之前确定字符集。如果找不到字符集,我会假设是ISO-8859-1(这不是通常的默认字符集吗?)。然后我会在HTML中搜索带有charset属性的meta标签。不过,我不太确定最好的做法是什么。我可以尝试用lxml创建一个树形结构(etree),但我不想读取整个文件,因为可能会遇到编码问题。但是,如果我不读取整个文件,就无法构建树形结构,因为有些标签可能还没有关闭。

我应该用一些复杂的字符串处理方法找到meta标签,然后一旦找到就跳出循环,或者在读取到一定行数后就停止吗?也许可以使用一个低级的HTML解析器,比如html.parser?顺便说一下,我是在用python3,感谢!

2 个回答

3

正确判断一个HTML文件的字符编码其实是个比较复杂的事情,不过HTML5的规范明确规定了处理器应该怎么做。你可以在这里找到相关的算法:http://dev.w3.org/html5/spec/parsing.html#determining-the-character-encoding

3

你首先应该尝试从HTTP头信息中提取编码。如果那里没有找到编码,你可以使用lxml来解析。这可能会有点棘手,因为如果字符集不匹配,lxml会报解析错误。一个解决办法是解码和编码数据时忽略那些未知的字符。

html_data=html_data.decode("UTF-8","ignore")
html_data=html_data.encode("UTF-8","ignore")

之后,你可以通过调用 lxml.HTML() 命令,并使用 utf-8 编码来解析。这样,你就能找到在HTML头信息中定义的正确编码。

找到编码后,你需要用正确的编码重新解析HTML文档。

不幸的是,有时候即使在HTML头信息中也找不到字符编码。我建议你在这些步骤都失败后,使用 chardet 模块来找到合适的编码。

撰写回答