Python 第三方库:lxml(高性能 XML/HTML 解析与处理)

lxml 是 Python 中功能最强大、性能最优的 XML 和 HTML 解析与处理库,基于 C 语言的 libxml2 和 libxslt 库开发,支持 XPath、XSLT、CSS 选择器等高级特性,广泛应用于网页抓取、数据提取、文档转换等场景。

安装:

nginx 复制代码
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 字符串

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

python 复制代码
from lxml import etree
tree = etree.parse("example.xml")root = tree.getroot()print(root.tag)

例 3:使用 XPath 查询

python 复制代码
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 选择器

xml 复制代码
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,否则调用时会报错。

nginx 复制代码
pip install cssselect

例 5:修改 XML 节点

python 复制代码
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 转换

python 复制代码
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 实例。

"点赞有美意,赞赏是鼓励"

相关推荐
用户83562907805110 小时前
使用 Python 在 Excel 中添加和编辑形状
后端·python
计算机魔术师10 小时前
OpenAI 首个踩红线的 AI 模型来了:能自己挖漏洞,但只给少数人用
前端
闲坐含香咀翠10 小时前
从 132MB 到 25MB:列式存储怎么把 CPU 缓存命中率提上去的
前端·数据结构·性能优化
2601_9623004710 小时前
python在运维上可以干什么,请举几个具体的例子
运维·python·系统管理·网络监控·自动化脚本
闲坐含香咀翠10 小时前
把 AntV S2 列头计算从 O(n²) 降到 O(n):一次开源组件的性能改造
前端·性能优化
闲坐含香咀翠10 小时前
Worker 常驻 + 零拷贝:postMessage 的结构化克隆算法与 Transferable 的真实代价
前端·性能优化
小刘在重生~10 小时前
Java 异常体系完整笔记
java·笔记·python
用户83562907805110 小时前
使用 Python 为 PDF 添加和管理超链接
后端·python
千千寰宇10 小时前
[Python/测试] pytest:简洁、可扩展的 Python 测试框架
python·软件质量保障与测试