lxml 是 Python 中功能最强大、性能最优的 XML 和 HTML 解析与处理库,基于 C 语言的 libxml2 和 libxslt 库开发,支持 XPath、XSLT、CSS 选择器等高级特性,广泛应用于网页抓取、数据提取、文档转换等场景。
安装:
pip install lxml
提示:
安装过程中会自动编译底层 C 库,推荐使用新版 pip。
Windows 用户建议使用 python -m pip install lxml 以避免环境冲突。
常见应用场景:
(1)HTML/XML 解析:从网页或 XML 文档中提取结构化数据。
(2)XPath 查询:用 XPath 表达式高效定位节点。
(3)CSS 选择器:用类似 jQuery 的选择器快速匹配 HTML 元素。
(4)文档修改:支持节点增删、属性修改、文本更新等。
(5)XSLT 转换:将 XML 转换为其他格式,如 HTML 或 JSON。
(6)高性能爬虫:配合 requests、aiohttp 等使用,解析速度快且内存占用低。
◆ ◆ ◆
核心概念
1、ElementTree API
lxml 提供与 Python 标准库 xml.etree.ElementTree 类似的 API,易于上手。
2、XPath 支持
内置完整的 XPath 1.0 实现,支持复杂查询。
3、HTML 容错解析
lxml.html 可处理不规范 HTML,常用于网页抓取。
4、CSS 选择器
通过 cssselect 扩展支持 CSS 风格选择器,比 XPath 更直观。
5、XSLT 转换
支持用 XSLT 样式表将 XML 转换为其他格式。
◆ ◆ ◆
应用举例
例 1:解析 XML 字符串
from lxml import etree
xml_data = "<root><item>foo</item><item>bar</item></root>"root = etree.fromstring(xml_data)print(root[0].text) # 输出: foo
例 2:从文件加载 XML
from lxml import etree
tree = etree.parse("example.xml")root = tree.getroot()print(root.tag)
例 3:使用 XPath 查询
from lxml import etree
# 构造 XML 数据xml_str = '''<root> <item>Apple</item> <item>Banana</item> <item>Cherry</item></root>'''
# 解析 XMLroot = etree.XML(xml_str)
# XPath 查询nodes = root.xpath("//item")
# 输出每个 <item> 的内容for node in nodes: print(node.text)
例 4:解析 HTML 并使用 CSS 选择器
from lxml import html
doc = html.fromstring("<html><body><p class='msg'>Hello</p></body></html>")print(doc.cssselect("p.msg")[0].text) # 输出: Hello
提示:需要安装 cssselect,否则调用时会报错。
pip install cssselect
例 5:修改 XML 节点
from lxml import etree
# 构造一个 XML 树root = etree.Element("root")child = etree.SubElement(root, "child")child.text = "original"
# 修改子元素内容与属性root[0].text = "updated"root[0].set("id", "123")
# 输出结果(带缩进和声明)print(etree.tostring(root, pretty_print=True, encoding="unicode"))
例 6:XSLT 转换
from lxml import etree
# 原始 XMLxml_root = etree.XML('''<root> <item>Hello XSLT</item></root>''')
# XSLT 样式表xslt_root = etree.XML('''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <html><body> <h1><xsl:value-of select="root/item"/></h1> </body></html> </xsl:template>
</xsl:stylesheet>''')
# 创建转换器transform = etree.XSLT(xslt_root)
# 应用转换result = transform(xml_root)
# 输出结果print(str(result))
◆ ◆ ◆
常用 API 与方法
etree.parse(path)
从文件解析 XML 或 HTML。
参数:
path (str 或 file-like):XML/HTML 文件路径或类文件对象。
返回:ElementTree 对象,可用于遍历和操作文档。
etree.fromstring(text)
从字符串解析 XML/HTML。
参数:
text (str):XML 或 HTML 格式的字符串。
返回:Element 对象,表示文档的根节点。
etree.tostring(element, pretty_print=False, encoding='utf-8')
将 XML/HTML 节点序列化为字符串。
参数:
element (Element):要序列化的节点或树。
pretty_print (bool):是否美化输出,默认 False。
encoding (str):输出编码,默认 utf-8。
返回:字节串 (bytes),通常需要 .decode() 转换为字符串。
element.xpath(expr, namespaces=None)
在 XML/HTML 中执行 XPath 查询。
参数:
expr (str):XPath 表达式。
namespaces (dict,可选):命名空间映射。
返回:通常返回一个 list,包含匹配的节点、字符串或数值。
element.cssselect(selector)
使用 CSS 选择器查询 HTML 元素。
参数:
selector (str):CSS 选择器字符串。
返回:list,包含匹配到的 Element 节点。
element.get(attr, default=None)
获取指定节点属性的值。
参数:
attr (str):属性名。
default (可选):如果属性不存在,返回该默认值。
返回:属性值字符串,如果不存在则返回 default。
element.set(attr, value)
为节点设置或修改属性。
参数:
attr (str):属性名。
value (str):属性值。
返回:无返回值。
etree.HTML(text)
解析 HTML 字符串并自动补全缺失标签。
参数:
text (str):HTML 内容。
返回:Element 对象,表示 HTML 文档根节点。
etree.XSLT(xslt_root)
加载并应用 XSLT 转换。
参数:
xslt_root (Element):XSLT 文档根节点。
返回:可调用的 XSLT 对象。
◆ ◆ ◆
补充说明
1、性能优势
lxml 基于 C 库实现,解析速度远超 xml.etree 和 BeautifulSoup。
2、容错性
lxml.html 对不规范 HTML 兼容性极佳。
3、与 BeautifulSoup 配合
可与 BeautifulSoup 搭配,在 lxml 提供底层解析器的情况下保持 API 简洁。
4、错误处理
捕获 lxml.etree.XMLSyntaxError 处理解析异常。
5、线程安全
lxml 本身是线程安全的,但避免在多线程中共享 ElementTree 实例。
“点赞有美意,赞赏是鼓励”