`lxml` 是一个功能强大、高效且符合标准的 Python XML 和 HTML 解析库
lxml是一个功能强大、高效且符合标准的 Python XML 和 HTML 解析库基于 C 语言编写的libxml2和libxslt库兼具速度与易用性。相比内置的xml.etree.ElementTreelxml支持更完整的 XML 特性如 XPath 1.0、XSLT、命名空间、DTD/Schema 验证、CSS 选择器等并提供更健壮的 HTML 解析通过lxml.html模块能自动修复不规范的 HTML。常用功能示例fromlxmlimportetree,html# ✅ 解析 XML 字符串严格模式xml_strrootitem id1namefoo/name/item/rootrootetree.fromstring(xml_str)print(root.xpath(//name/text())[0])# 输出: foo# ✅ 解析 HTML容错性强自动修复html_strdivphellobworlddochtml.fromstring(html_str)print(html.tostring(doc,encodingunicode).strip())# 自动补全标签# ✅ 使用 CSS 选择器需 lxml.htmlp_tagdoc.cssselect(p)[0]print(p_tag.text)# hello# ✅ 写入与序列化print(etree.tostring(root,pretty_printTrue,encodingunicode))性能优势解析速度通常比ElementTree快 3–5 倍尤其在大型文档或复杂 XPath 查询时支持增量解析iterparse和流式处理内存友好提供etree.XMLParser(recoverTrue)或html.parse()处理破损标记。⚠️ 注意事项需通过pip install lxml安装部分系统可能需先安装libxml2-dev/libxslt-dev默认不校验 DTD可显式启用以增强安全性处理不受信 HTML/XML 时建议禁用外部实体加载resolve_entitiesFalse以防 XXE 攻击。为防止 XXEXML External Entity攻击必须禁用外部实体解析和 DTD 加载。lxml默认会解析 DTD 并加载外部实体如!ENTITY % ext SYSTEM http://malicious.com/evil.dtd这可能导致文件读取、SSRF 或 DoS。以下是安全解析不受信 XML 的关键实践✅ 正确做法推荐fromlxmlimportetree# ✅ 安全解析完全禁用 DTD 和外部实体parseretree.XMLParser(resolve_entitiesFalse,# 禁用实体解析核心no_networkTrue,# 禁止网络访问防 SSRFload_dtdFalse,# 不加载 DTDdtd_validationFalse,# 不进行 DTD 验证)try:rootetree.fromstring(untrusted_xml,parserparser)exceptetree.XMLSyntaxErrorase:raiseValueError(Invalid or malicious XML)frome✅ 更严格方案显式移除 DOCTYPE 声明# 预处理移除所有 DOCTYPE 声明防御性编程importre safe_xmlre.sub(r\!DOCTYPE[^]*,,untrusted_xml,flagsre.IGNORECASE|re.DOTALL)rootetree.fromstring(safe_xml,parserparser)✅ 使用etree.RestrictedElementTreelxml ≥ 4.8.0# 自动限制危险功能推荐用于高危场景fromlxmlimportetree parseretree.XMLParser(recoverFalse,resolve_entitiesFalse,no_networkTrue)# 注意RestrictedElementTree 尚未成为官方稳定 API但可配合自定义解析器使用⚠️ 错误示例危险# ❌ 危险默认 parser 可能触发 XXEetree.fromstring(untrusted_xml)# resolve_entitiesTrue by default!# ❌ 危险启用 DTD 验证且未禁用网络etree.XMLParser(dtd_validationTrue)# 若文档含外部 DTD将发起网络请求 补充建议对 HTML 解析优先使用lxml.html.fromstring()其默认禁用 DTD/XXE在 Web 服务中应结合输入长度限制、超时控制与沙箱环境审计依赖项确保lxml版本 ≥ 4.6.0修复过若干 XXE 边界绕过问题。