Base Tools-Associate-Fourth:lxml库详解

关联标准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>

三、常见应用场景

  1. 网络爬虫 :爬取网页后,用lxml解析 HTML,提取标题、内容、链接等数据(比正则表达式更易维护)
  2. XML 数据处理 :读取 / 生成 XML 配置文件、解析 XML 格式的接口返回数据
  3. HTML 模板处理 :==修改 HTML 文档的内容(如批量替换标签、添加属性)

四、注意事项

  1. 编码问题 :解析时建议指定encoding="utf-8",避免中文乱码
  2. XPath 返回值xpath()方法返回列表,即使只有一个结果,也需要用[0]取第一个元素(需注意空列表的情况,避免索引错误)
  3. 性能lxml是解析 HTML/XML 最快的 Python 库之一,但解析超大文件时,建议用迭代解析(etree.iterparse),避免加载整个文档到内存

总结

  1. lxml 是 Python 处理 XML/HTML 的高性能库,核心优势是速度快支持 XPath兼容不规范 HTML
  2. 核心用法:通过html.fromstring()/etree.fromstring()解析文档,用xpath()查询节点,用etree.Element/SubElement构建 / 修改文档
  3. 最常用场景是爬虫解析 HTML、XML 数据处理,XPath 是lxml查询节点的核心语法,需掌握///@/text()等基础用法
相关推荐
喵手2 个月前
Python爬虫实战:构建招聘会数据采集系统 - requests+lxml 实战企业名单爬取与智能分析!
爬虫·python·爬虫实战·requests·lxml·零基础python爬虫教学·招聘会数据采集
深蓝电商API5 个月前
解析器的抉择:parsel vs lxml,在 Scrapy 中如何做出最佳选择?
scrapy·lxml·parsel
一晌小贪欢8 个月前
Python100个库分享第38个—lxml(爬虫篇)
爬虫·python·python爬虫·lxml·python库分享
代码讲故事10 个月前
解决 xmlsec.InternalError: (-1, ‘lxml & xmlsec libxml2 library version mismatch‘)
linux·python·pip·lxml·xmlsec·libxml2
MinggeQingchun1 年前
Python - 爬虫-网页解析数据-库lxml(支持XPath)
爬虫·python·xpath·lxml
莓事哒1 年前
使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)
爬虫·python·selenium·pycharm·lxml
白雪公主的后妈1 年前
Python爬虫基础——XPath表达式
爬虫·python·lxml·etree
bananaplan1 年前
Python 爬虫必备杀器,xpath 解析 HTML
xpath·lxml