仓库: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. 官方仓库链接
- 仓库主页:https://github.com/lxml/lxml
- 官方网站:https://lxml.de/
- 安装文档:https://lxml.de/installation.html
- 开发文档:仓库内
doc/main.txt - Issue tracker:https://bugs.launchpad.net/lxml
- PyPI:https://pypi.org/project/lxml/
- 作者商业咨询:http://consulting.behnel.de/
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-devDebian 系也可以直接:
sudo apt-get build-dep python3-lxmlmacOS 可通过 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 lxml5.2 Linux 系统包
Debian / Ubuntu:
sudo apt-get install python3-lxmlmacOS MacPorts:
sudo port install py39-lxml5.3 CI 加速编译
官方 INSTALL.txt 提示:在 CI 环境里关掉 C
编译器优化可加快构建:
CFLAGS="-O0" pip install lxml6. 最小示例代码
解析一段 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 进行网页数据采集时,请遵守以下原则:
- 遵守目标网站的
robots.txt与服务条款(ToS),不采集明确禁止抓取的路径; - 控制抓取节奏与并发,避免对目标服务器造成压力;
- 不绕过登录态、付费墙或反爬机制,不伪造身份获取付费内容;
- 不批量抓取个人隐私数据,不收集、存储、传播可识别个人身份的信息;
- 仅将解析得到的公开数据用于学习、研究与合规的业务用途;
- 尊重原作者版权,转载或二次发布内容时注明来源并遵守相应授权。