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 字符串,包含版块、点击、站内回复数、分页数、楼主、原文等信息

注意事项

  1. 主贴(pid=0)不放入「回复」列表,而是写入元数据的扩展字段中的「原文」字段。
  2. 「回复」列表只包含 pid>0 的楼层。
  3. 若帖子没有时间信息,该帖子会被跳过。
  4. 大批量处理建议使用 --resume 断点续传,避免重复处理。

数据模式

数据模式定义在 forum_schema.py 中,使用 Pydantic 进行数据验证和序列化。