Loading...

文章背景图

lxml:Python 高性能 XML/HTML 解析库(libxml2 绑定)|安装与使用指南

2026-11-06
0
- 字
- 分钟
|

仓库:https://github.com/lxml/lxml 官方文档:https://lxml.de/ 许可证:BSD-3-Clause 与历史 LGPL/BSD 双许可(详见仓库 LICENSES.txt) Python 版本要求:lxml 7.0 起要求 Python 3.9+

1. 项目简介与定位

lxml 是 Python 生态里最富功能、也最易上手的 XML / HTML 处理库,底层绑定 C 库 libxml2 与 libxslt。官方 README 第一句就是:"lxml is the most feature-rich and easy-to-use library for processing XML and HTML in the Python language. It's also very fast and memory friendly."

它不是 HTTP 客户端,不会自己发请求;它做的是拿到一段 XML / HTML 之后,用 XPath、CSS 选择器、元素树操作把数据抠出来。在爬虫场景里,lxml 通常和 httpx / requests 配合:后者负责抓页面,lxml 负责解析。

1.1 核心信息一览

项目 内容
仓库 lxml/lxml
定位 Python 绑定 libxml2/libxslt 的高性能 XML/HTML 解析库
开源协议 见仓库 LICENSES.txt(BSD-3-Clause 等多许可)
安装方式 pip install lxml 或系统包管理器
Python 版本 lxml 7.0+ 要求 Python 3.9+;6.0+ 要求 3.8+;5.0+ 要求 3.6+
系统依赖 libxml2 ≥ 2.9.2、libxslt ≥ 1.1.27
官方文档 https://lxml.de/

1.2 适用场景

  • 需要解析大型 XML / HTML 文档,对速度与内存敏感;
  • 想用 XPath 1.0 精确提取节点,而不是写一堆正则;
  • 需要做 XSLT 转换、XML Schema / Relax NG 校验;
  • 做爬虫解析层,配合 requests / httpx 使用。

2. 开源协议

lxml 采用多许可模式,仓库根目录 LICENSES.txt 列出可选许可证,常见为 BSD-3-Clause(同时保留历史 LGPL 选项)。允许商用、修改、再分发,义务是保留版权声明。具体条款以仓库 LICENSES.txt 原文为准。

3. 官方仓库链接

4. 前置要求

来自官方 INSTALL.txt:

  • Python 版本:lxml 7.0+ 需要 Python 3.9+;lxml 6.0+ 需要 3.8+;lxml 5.0+ 需要 3.6+;

  • 系统库(除非使用静态二进制 wheel):

    • libxml2 ≥ 2.9.2;
    • libxslt ≥ 1.1.27(官方推荐 ≥ 1.1.28);
  • Linux 编译开发包(从源码编译时需要):

    sudo apt-get install libxml2-dev libxslt-dev python-dev

    Debian 系也可以直接:

    sudo apt-get build-dep python3-lxml
  • macOS 可通过 MacPorts:sudo port install py39-lxml;

  • Windows 官方提供预编译 wheel,通常无需自己装 libxml2。

5. 安装部署

5.1 通用 pip 安装(官方推荐)

pip install lxml

指定版本:

pip install lxml==5.0.0

全局安装时需要加 sudo(不建议,推荐 venv):

sudo pip install lxml

5.2 Linux 系统包

Debian / Ubuntu:

sudo apt-get install python3-lxml

macOS MacPorts:

sudo port install py39-lxml

5.3 CI 加速编译

官方 INSTALL.txt 提示:在 CI 环境里关掉 C 编译器优化可加快构建:

CFLAGS="-O0" pip install lxml

6. 最小示例代码

解析一段 HTML 并用 XPath 提取:

from lxml import html

doc = html.fromstring("""
<html><body>
  <h1 class="title">Hello lxml</h1>
  <ul><li>苹果</li><li>香蕉</li></ul>
</body></html>
""")

title = doc.xpath('//h1[@class="title"]/text()')[0]
items = doc.xpath('//ul/li/text()')

print(title)   # Hello lxml
print(items)   # ['苹果', '香蕉']

解析远程抓取回来的页面(配合 httpx / requests):

import httpx
from lxml import html

r = httpx.get('https://example.org/')
tree = html.fromstring(r.text)
for a in tree.xpath('//a/@href'):
    print(a)

7. 配置项

lxml 没有配置文件,行为通过解析器与函数参数控制。常用项:

配置点 作用
etree.HTMLParser(...) / html.fromstring(...) 选择 HTML 或 XML 解析器
recover=True 容错模式,尽量解析不规范 HTML
remove_blank_text=True 序列化时去掉空白文本节点
parser.resolve_entities 是否解析外部实体(生产环境建议关闭,防 XXE)
etree.XSLT(...) 加载 XSLT 样式表做转换
etree.XMLSchema(...) / RelaxNG(...) XML Schema / Relax NG 校验

8. 常见问题

  • pip install 时报 libxml2 版本不对? 先用系统包管理器装 libxml2-dev libxslt-dev,或直接用 PyPI 上的 manylinux / macOS / Windows 预编译 wheel,避免本地编译。
  • 能直接发 HTTP 请求吗? 不能。lxml 只做解析,抓页面请用 httpx / requests / aiohttp。
  • 和 BeautifulSoup 是什么关系? BeautifulSoup 4 底层可以选 lxml 作为解析器(BeautifulSoup(markup, "lxml")),速度比内置 html.parser 快很多。
  • XXE 安全? 解析不可信 XML 时务必使用安全默认值,禁止加载外部实体,官方文档有专门章节讨论。
  • Python 版本对应不上? 对照 INSTALL.txt:7.0+ 要 3.9+、6.0+ 要 3.8+、5.0+ 要 3.6+,老系统装老版本 lxml。
  • 支持 XPath 几? lxml 实现的是 XPath 1.0。

9. 与同类工具对比

  • vs BeautifulSoup:BS4 API 更友好、容错更强,但底层默认解析器较慢;lxml 速度最快,但 API 偏 XML 风格。生产里常用 BeautifulSoup(markup, "lxml") 两者兼得。
  • vs xml.etree.ElementTree:ET 是标准库,零依赖;lxml 是 ET 的 C 加速超集,API 几乎兼容,但快一个量级且支持 XSLT/Schema。
  • vs parsel / selectolax:parsel 在 lxml 之上加了 CSS 选择器;selectolax 是另一套基于 Modest 引擎的高速解析器。
  • vs 正则:解析 HTML 不要用正则,lxml 专门解决标签嵌套、属性转义这类正则搞不定的问题。

10. 许可

lxml 以多许可方式发布(BSD-3-Clause 为主,历史保留 LGPL 选项):

  • 允许个人与商业使用、修改、再分发;
  • 再分发需保留版权声明与许可证文本;
  • 选择哪一份许可证以发行版 LICENSES.txt 为准。

11. 责任使用声明

使用 lxml 进行网页数据采集时,请遵守以下原则:

  1. 遵守目标网站的 robots.txt 与服务条款(ToS),不采集明确禁止抓取的路径;
  2. 控制抓取节奏与并发,避免对目标服务器造成压力;
  3. 不绕过登录态、付费墙或反爬机制,不伪造身份获取付费内容;
  4. 不批量抓取个人隐私数据,不收集、存储、传播可识别个人身份的信息;
  5. 仅将解析得到的公开数据用于学习、研究与合规的业务用途;
  6. 尊重原作者版权,转载或二次发布内容时注明来源并遵守相应授权。
评论交流

文章目录