Python轮子:lxml~xlm解析利器

原文链接: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表达式需考虑命名空间
  • 确保输入数据编码一致性

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注