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 实例。

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

相关推荐
IT_陈寒1 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰2 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
竹林8182 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
用户8356290780512 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户8356290780512 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
妙码生花3 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
Awu12273 小时前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
咪库咪库咪4 小时前
Vue3-生命周期
前端
莪_幻尘4 小时前
你的 AI Skill 越多越蠢?Token 上下文爆炸的求生指南
前端·ai编程
lichenyang4535 小时前
从 has.echo 到异步 API 注册表:一次 ASCF API 回调不触发的排查复盘
前端