lxml 是基于 libxml2/libxslt 的高效 XML/HTML 处理库,支持 XPath、XSLT 和命名空间;常用 fromstring/parse 解析、XPath 提取、Element 构建和 iterparse 流式处理。

lxml 是 Python 中最强大、最常用的 XML/HTML 处理库之一,底层基于 C 的 libxml2 和 libxslt,比标准库 xml.etree.ElementTree 更快、功能更全,尤其适合处理大文件、需要 XPath、XSLT 或命名空间的场景。
快速解析 XML 字符串或文件
用 etree.fromstring() 解析字符串,etree.parse() 解析文件(支持本地路径或类文件对象):
-
从字符串解析:
root = etree.fromstring(xml_str) -
从文件解析:
tree = etree.parse("data.xml"); root = tree.getroot() -
带错误容错:加
parser=etree.XMLParser(recover=True)可跳过格式错误继续解析(慎用于生产数据校验)
高效提取数据:XPath 比 find/findall 更灵活
ElementTree 的 find() 只支持简单路径,而 lxml 支持完整 XPath 1.0 表达式,性能好、表达力强:
-
titles = root.xpath("//book/title/text()")—— 一行取所有 title 文本 -
expensive = root.xpath('//book[price > 30]/title/text()')—— 带条件过滤 -
first_author = root.xpath('(//author)[1]/text()')[0]—— 索引和函数支持 - 注意:返回的是列表,空结果不报错,记得判空再取值
安全生成 XML:避免拼接字符串
别用 f",易出标签/属性转义问题。用 Element 构建 + etree.SubElement() + tostring():
立即学习“Python免费学习笔记(深入)”;
root = etree.Element("library")-
book = etree.SubElement(root, "book", id="123")—— 自动转义属性值 -
title = etree.SubElement(book, "title").text = "Python & XML"—— 自动转义文本中的 xml_bytes = etree.tostring(root, encoding="utf-8", pretty_print=True, xml_declaration=True)
处理命名空间和大文件的实用技巧
真实 XML 常含 namespace(如 SOAP、RSS),lxml 支持前缀映射;对超大 XML,用 iterparse() 流式处理防内存爆炸:
-
ns = {"ns": "http://example.com/ns"},然后root.xpath("//ns:book", namespaces=ns) -
for event, elem in etree.iterparse("huge.xml", events=("start", "end")):—— 边读边处理,用完elem.clear()释放子节点内存 - 生成时加
method="html"可输出无闭合标签的 HTML 风格(如)
基本上就这些。掌握 fromstring / parse、XPath 提取、Element 构建、iterparse 流式处理,就能覆盖 95% 的 XML 场景。不复杂但容易忽略细节——比如忘记命名空间映射,或没清内存导致 OOM。










