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

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

相关推荐
似水明俊德1 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
qq_417695051 小时前
机器学习与人工智能
jvm·数据库·python
漫随流水1 小时前
旅游推荐系统(view.py)
前端·数据库·python·旅游
Thera7772 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
yy我不解释2 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
踩着两条虫2 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
炘爚3 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon3 小时前
C#常用类库-详解SerialPort
开发语言·c#
凸头3 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141593 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm