原文链接:http://www.juzicode.com/python-module-lxml
lxml是Python的高性能XML/HTML处理库,结合了libxml2和libxslt的C语言高效性,提供简洁的Pythonic API,支持XPath、XSLT解析等高级功能,比内置xml模块快10倍以上。
应用场景
- 大规模XML/HTML文档解析
- 网页爬虫数据提取
- XML数据转换与清洗
- 配置文件解析
- SOAP/REST API响应处理
- Office文档解析(OOXML)
安装与导入
# 安装命令
pip install lxml
# 常用导入方式
from lxml import etree
from lxml import html
使用方法
1)XML解析与遍历
使用etree解析XML并遍历节点:
# juzicode.com/VX公众号:juzicode
from lxml import etree
xml_data = '''
<library>
<book id="101">
<title>Python基础</title>
<author>张三</author>
</book>
<book id="102">
<title>数据科学实战</title>
<author>王五</author>
</book>
</library>
'''
# 解析XML
root = etree.fromstring(xml_data)
# 遍历所有book节点
for book in root.findall('book'):
print(f"ID: {book.get('id')}")
print(f"标题: {book.find('title').text}")
print(f"作者: {book.find('author').text}\n")
运行结果:
ID: 101 标题: Python基础 作者: 张三 ID: 102 标题: 数据科学实战 作者: 王五
2)XPath数据提取
使用XPath表达式精准提取HTML数据:
# juzicode.com/VX公众号:juzicode
from lxml import html
# 示例HTML(实际应用中从网络获取)
html_content = '''
<html>
<body>
<div class="products">
<div class="item">
<span class="name">笔记本</span>
<span class="price">¥5999</span>
</div>
<div class="item">
<span class="name">手机</span>
<span class="price">¥3999</span>
</div>
</div>
</body>
</html>
'''
# 创建HTML解析树
tree = html.fromstring(html_content)
# 使用XPath提取数据
products = tree.xpath('//div[@class="item"]')
for product in products:
name = product.xpath('.//span[@class="name"]/text()')[0]
price = product.xpath('.//span[@class="price"]/text()')[0]
print(f"商品: {name}, 价格: {price}")
运行结果:
商品: 笔记本, 价格: ¥5999 商品: 手机, 价格: ¥3999
3)XML文档构建
使用lxml动态生成XML文档:
# juzicode.com/VX公众号:juzicode
from lxml import etree
# 创建根节点
root = etree.Element("catalog")
# 添加带属性的子节点
product1 = etree.SubElement(root, "product", id="1001")
etree.SubElement(product1, "name").text = "无线鼠标"
etree.SubElement(product1, "price").text = "129.00"
product2 = etree.SubElement(root, "product", id="1002")
etree.SubElement(product2, "name").text = "机械键盘"
etree.SubElement(product2, "price").text = "499.00"
# 生成XML字符串
xml_str = etree.tostring(root, pretty_print=True, encoding='utf-8').decode()
print(xml_str)
运行结果:
<catalog> <product id="1001"> <name>无线鼠标</name> <price>129.00</price> </product> <product id="1002"> <name>机械键盘</name> <price>499.00</price> </product> </catalog>
4)XML转换(XSLT)
使用XSLT样式表转换XML数据:
# juzicode.com/VX公众号:juzicode
from lxml import etree
# 原始XML
xml_data = '''
<books>
<book>
<title>Python高级编程</title>
<price>89.00</price>
</book>
</books>
'''
# XSLT转换模板
xslt_template = '''
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>图书列表</h2>
<xsl:for-each select="books/book">
<div>
<h3><xsl:value-of select="title"/></h3>
<p>价格: <xsl:value-of select="price"/>元</p>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
'''
# 执行转换
xml_doc = etree.fromstring(xml_data)
xslt_doc = etree.fromstring(xslt_template)
transform = etree.XSLT(xslt_doc)
html_result = transform(xml_doc)
print(str(html_result))
运行结果:
<html> <body> <h2>图书列表</h2> <div> <h3>Python高级编程</h3> <p>价格: 89.00元</p> </div> </body> </html>
5)HTML5解析
处理现代HTML5文档:
# juzicode.com/VX公众号:juzicode
from lxml import html
# 含HTML5标签的文档
html5_content = '''
<!DOCTYPE html>
<html>
<body>
<article>
<header>
<h1>人工智能新突破</h1>
</header>
<section>
<p>最新研究实现了...</p>
<figure>
<img src="ai.jpg" alt="AI示意图">
<figcaption>图1: AI架构</figcaption>
</figure>
</section>
</article>
</body>
</html>
'''
# 解析HTML5
doc = html.document_fromstring(html5_content)
# 提取信息
title = doc.find('.//h1').text
caption = doc.find('.//figcaption').text
print(f"标题: {title}")
print(f"图片说明: {caption}")
运行结果:
标题: 人工智能新突破 图片说明: 图1: AI架构
总结
lxml核心优势:
- C语言级处理速度,百万级文档高效处理
- 完整支持XPath 1.0/XSLT 1.0标准
- 自动处理HTML编码和混乱标记
- 同时支持DOM和SAX解析模式
注意事项:
- 处理超大型文件需使用迭代解析
- XPath表达式需考虑命名空间
- 确保输入数据编码一致性