应使用 lxml.html.fromstring 而非 etree.fromstring 解析 html,因其具备容错修复能力;处理编码混乱时需手动 decode;解析失败常导致空结果,应检查 body 是否存在并启用 recover=true;script 中的 html 片段需预先剥离。

lxml.etree.fromstring 解析乱码 HTML 会直接报错
遇到 XMLSyntaxError 或 ParserError: Document is empty 不是 HTML 本身“坏了”,而是 lxml.etree.fromstring 默认按严格 XML 规则解析,连缺失 闭合、属性没引号、嵌套错乱都会拒收。
真正该用的是 lxml.html.fromstring —— 它底层调用的是 libxml2 的 HTML 解析器,自带容错逻辑,能自动修复常见错误:补全 、修正自闭合标签、忽略非法字符序列。
- 别用
etree.fromstring(html_text)处理网页源码,哪怕它看起来像 XML - 一律改用
html.fromstring(html_text),哪怕你后续只取<div> 内容 <li>如果原始数据含 BOM 或编码声明混乱(比如 <code><meta charset="gb2312">锛











