用 lxml.iterparse() 替代 beautifulsoup 可显著降低大 html 文件解析内存占用:流式解析、及时清理节点、只保留目标标签、二进制读取、预截断过滤、避免全量加载与递归文本提取,并流式写入结果。

用 lxml 替代 BeautifulSoup 解析超大 HTML 文件
默认用 BeautifulSoup(html, 'html.parser') 处理几十 MB 以上的 HTML,很容易触发 OOM —— 它会把整个 DOM 树加载进内存,且不释放中间节点。lxml 的 etree.iterparse() 是流式解析,边读边建树、边处理边清理,内存占用稳定在几 MB 级别。
关键点:
- 不用
etree.parse()(全量加载),改用etree.iterparse(file_obj, events=('start', 'end')) - 监听
'end'事件后立刻调用elem.clear()和elem.getparent().remove(elem),防止子树累积 - 只保留你需要的标签(如
'p','h1'),其他一律跳过,减少对象创建 - 文件必须以二进制模式打开:
open('big.html', 'rb'),避免解码开销和隐式缓存
提前截断或过滤 HTML 再解析
很多大 HTML 实际有效内容只在前半部分(比如日志归档页、爬虫 dump),后面全是重复脚本或空 div。硬解析整体会白耗内存。
实操建议:
- 用
file.read(5_000_000)(5MB)先读头段,检查是否含
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











