tianya-mnbvc
February 11, 2026 · View on GitHub
天涯论坛的 MNBVC 清洗代码,用于将天涯论坛的 HTML 格式帖子清洗为 JSONL 格式。
项目说明
本项目用于清洗天涯论坛的 HTML 格式帖子数据,将其转换为符合 MNBVC 数据规范的 JSONL 格式。
功能特性
- 单进程运行,便于控制内存(目标 < 25GB)
- 支持多页帖子的自动聚合(同一 thread_id 多页合并为一条)
- 提取帖子标题、作者、时间、回复等完整信息
- 主贴内容存入元数据扩展字段
- 输出按 500MB 自动分片,文件名带时间戳(如
tianya_20260212_005948.jsonl) - 支持断点续传(
--resume),跳过已输出的帖子
目录结构
tianya-mnbvc/
├── clean_tianya_html_to_jsonl.py # 主清洗脚本
├── forum_schema.py # 数据模式定义
├── src_dir/ # 输入目录(HTML 文件)
│ └── tianya_html/ # 天涯 HTML 文件目录
├── dest_dir/ # 输出目录(JSONL 文件,单文件最大 500MB)
│ └── tianya_YYYYMMDD_HHMMSS.jsonl # 带时间戳的清洗结果
└── README.md # 项目说明文档
环境要求
- Python 3.6+
- beautifulsoup4
- lxml(推荐,提升解析速度)
安装依赖
pip install beautifulsoup4 lxml
使用方法
运行说明
推荐:将 HTML 放在 src_dir/tianya_html,结果输出到 dest_dir(自动创建带时间戳的 jsonl,单文件最大 500MB)。
# 全量清洗(输入目录默认 src_dir/tianya_html,输出默认 dest_dir/tianya.jsonl)
python clean_tianya_html_to_jsonl.py
# 指定绝对路径
python clean_tianya_html_to_jsonl.py --input D:\MNBVC\tianya-mnbvc\src_dir\tianya_html --output D:\MNBVC\tianya-mnbvc\dest_dir\tianya.jsonl
参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
--input | 输入目录(HTML 所在目录) | src_dir/tianya_html |
--output | 输出 jsonl 基础路径(实际会生成带时间戳的文件) | dest_dir/tianya.jsonl |
--limit | 只处理前 N 个帖子(0 表示全量) | 0 |
--resume | 断点续传,跳过输出目录中已存在的帖子 ID | 关闭 |
--quiet | 减少控制台输出 | 关闭 |
示例
# 全量处理
python clean_tianya_html_to_jsonl.py
# 只处理前 100 个帖子(用于测试)
python clean_tianya_html_to_jsonl.py --limit 100
# 断点续传(中断后再次运行可接着写)
python clean_tianya_html_to_jsonl.py --resume
# 指定路径 + 断点续传
python clean_tianya_html_to_jsonl.py --input src_dir/tianya_html --output dest_dir/tianya.jsonl --resume
内存与输出
- 单进程运行,每处理约 500 个帖子执行一次
gc,目标内存 < 25GB。 - 单个 jsonl 文件超过 500MB 会自动切到新文件,文件名带时间戳,例如:
tianya_20260212_005948.jsonl。
输入文件格式
输入文件命名格式:{thread_id}_{page}.html
例如:
12633372_1.html- 帖子 ID 为 12633372 的第 1 页12633372_2.html- 帖子 ID 为 12633372 的第 2 页
输出格式
输出为 JSONL 格式,每行一个 JSON 对象,包含以下字段:
ID: 帖子 ID主题: 帖子标题来源: 固定为 "tianya"时间: 发帖日期(格式:YYYYMMDD)回复: 回复列表,每个回复包含:楼ID: 楼层 ID回复: 回复内容扩展字段: JSON 字符串,包含回复人、回复时间、uid、pid、page、is_host 等信息
元数据: 包含:发帖时间: 完整时间(格式:YYYYMMDD HH:MM:SS)回复数: 回复数量扩展字段: JSON 字符串,包含版块、点击、站内回复数、分页数、楼主、原文等信息
注意事项
- 主贴(pid=0)不放入「回复」列表,而是写入元数据的扩展字段中的「原文」字段。
- 「回复」列表只包含 pid>0 的楼层。
- 若帖子没有时间信息,该帖子会被跳过。
- 大批量处理建议使用
--resume断点续传,避免重复处理。
数据模式
数据模式定义在 forum_schema.py 中,使用 Pydantic 进行数据验证和序列化。