关联标准1:XML(Extensible Markup Language)
关联标准2:XPath(XML Path Language)查询语言
关联标准3:HTML(HyperText Markup Language)
关联标准4:CSS(Cascading Style Sheet)
lxml 是 Python 中处理 XML 和 HTML 的高性能库,它基于 C 语言的 libxml2 和 libxslt 库 ,兼具速度快、功能全、API 友好的特点,是爬虫、数据解析场景中最常用的 HTML/XML 解析工具之一
一、核心概念与安装
安装
首先确保安装了lxml,终端执行:
bash
pip install lxml
核心模块
lxml 最常用的两个模块:
lxml.etree:处理 XML/HTML 的核心模块,提供解析、构建、修改文档的能力lxml.html:专门优化 HTML 解析(兼容不规范的 HTML,比如缺少闭合标签的情况)
二、核心功能与实战示例
解析 HTML/XML 文档
lxml 支持从字符串、文件、URL 解析文档,核心是生成「ElementTree」(元素树)和「Element」(节点)对象
示例 1:解析字符串形式的 HTML
python
from lxml import etree, html
# 待解析的不规范HTML(缺少闭合标签,lxml可自动修复)
html_str = """
<div class="content">
<h1>lxml详解</h1>
<ul id="features">
<li>速度快</li>
<li>功能全
<li>支持XPath</li>
</ul>
</div>
"""
# 1. 解析HTML(使用html模块,兼容不规范HTML)
tree = html.fromstring(html_str)
# 或用etree解析(需指定解析器,否则可能识别为XML)
# parser = etree.HTMLParser()
# tree = etree.fromstring(html_str, parser=parser)
# 2. 解析XML(要求格式规范,标签必须闭合)
xml_str = """
<bookstore>
<book category="python">
<title>Python编程</title>
<price>99</price>
</book>
</bookstore>
"""
xml_tree = etree.fromstring(xml_str)
核心查询:XPath 语法(lxml 的核心优势)
lxml 完美支持 XPath 1.0 语法,这是定位文档节点最灵活、高效的方式
先记住 XPath 常用语法:
| 语法 | 含义 | 示例 |
|---|---|---|
// |
匹配任意层级的节点 | //li 匹配所有 li 标签 |
/ |
匹配直接子节点 | div/ul 匹配 div 下的 ul |
@ |
匹配属性 | //div[@class="content"] |
text() |
匹配节点文本 | //h1/text() |
[] |
条件筛选 | //li[2] 匹配第二个 li |
示例 2:XPath 查询实战
python
# 基于示例1的tree(HTML解析结果)
# 1. 获取h1标签的文本
h1_text = tree.xpath('//h1/text()')[0]
print("h1文本:", h1_text) # 输出:h1文本: lxml详解
# 2. 获取class="content"的div下的所有li文本
li_texts = tree.xpath('//div[@class="content"]//li/text()')
print("所有li文本:", li_texts) # 输出:所有li文本: ['速度快', '功能全', '支持XPath']
# 3. 获取id="features"的ul标签
ul_node = tree.xpath('//ul[@id="features"]')[0]
print("ul标签的标签名:", ul_node.tag) # 输出:ul标签的标签名: ul
构建 / 修改 XML/HTML 文档
lxml 不仅能解析,还能手动创建、修改节点
示例 3:构建 XML 文档
python
from lxml import etree
# 1. 创建根节点
root = etree.Element("bookstore")
# 2. 创建子节点并设置属性
book = etree.SubElement(root, "book", category="python")
# 3. 为book添加子节点
title = etree.SubElement(book, "title")
title.text = "lxml实战"
price = etree.SubElement(book, "price")
price.text = "88"
# 4. 生成XML字符串(带缩进,更易读)
xml_str = etree.tostring(root, encoding="utf-8", pretty_print=True).decode("utf-8")
print("生成的XML:")
print(xml_str)
"""
输出:
<bookstore>
<book category="python">
<title>lxml实战</title>
<price>88</price>
</book>
</bookstore>
"""
# 5. 修改节点:修改price的文本
price.text = "78"
# 添加新属性
book.set("author", "张三")
处理文件:读取 / 写入
python
# 1. 写入XML文件
with open("books.xml", "wb") as f:
f.write(etree.tostring(root, encoding="utf-8", pretty_print=True))
# 2. 读取XML文件
tree = etree.parse("books.xml")
root = tree.getroot()
# 查询文件中的book标签属性
print("book的category:", root.find("book").get("category")) # 输出:python
处理不规范 HTML(爬虫常用)
网页的 HTML 往往不规范(缺少闭合标签、大小写混用),lxml.html 能自动修复
python
from lxml import html
# 不规范的HTML
bad_html = '<p>lxml<p>解析不规范HTML'
# 解析并修复
tree = html.fromstring(bad_html)
# 输出修复后的HTML
fixed_html = html.tostring(tree, encoding="utf-8").decode("utf-8")
print("修复后的HTML:", fixed_html) # 输出:<p>lxml</p><p>解析不规范HTML</p>
三、常见应用场景
- 网络爬虫 :爬取网页后,用
lxml解析 HTML,提取标题、内容、链接等数据(比正则表达式更易维护) - XML 数据处理 :读取 / 生成 XML 配置文件、解析 XML 格式的接口返回数据
-
HTML 模板处理 :==修改 HTML 文档的内容(如批量替换标签、添加属性)
四、注意事项
- 编码问题 :解析时建议指定
encoding="utf-8",避免中文乱码 - XPath 返回值 :
xpath()方法返回列表,即使只有一个结果,也需要用[0]取第一个元素(需注意空列表的情况,避免索引错误) - 性能 :
lxml是解析 HTML/XML 最快的 Python 库之一,但解析超大文件时,建议用迭代解析(etree.iterparse),避免加载整个文档到内存
总结
lxml是 Python 处理 XML/HTML 的高性能库,核心优势是速度快 、支持 XPath 、兼容不规范 HTML- 核心用法:通过
html.fromstring()/etree.fromstring()解析文档,用xpath()查询节点,用etree.Element/SubElement构建 / 修改文档 - 最常用场景是爬虫解析 HTML、XML 数据处理,XPath 是
lxml查询节点的核心语法,需掌握///@/text()等基础用法