电子书文本到结构化内容的转换脚本 (TXT to JSON EPUB Converter)
把纯文本/HTML 书籍源裁剪、切分、转换成分结构化的输出(JSON / Markdown / EPUB)供前端阅读器消费。这类「内容生成器 + 裁剪 convert 脚本」是电子书/属灵书报类 App 的可复用方法论。
背景:为什么需要这套脚本
属灵书报这类内容没有统一的结构化数据库,原始形态是散落的 HTML 页面或 txt 文本(如晨兴圣言 ysz 的 -g.txt/0Y.txt 等)。要把它们变成 App 能展示、能按书/章/节导航的内容,需要一套批量 convert 脚本。
典型案例:zhao-zg/books 仓库里的三个脚本
process_html_books.py:处理resource/html/下 8 个子目录的 HTML,提取纯文本,按书籍分类,输出 JSON 到resource/zl-html/。process_ysz_books.py(约 67KB):处理晨兴圣言(ysz)文本。ysz_to_md.py(约 22KB):晨兴圣言文本转 Markdown。main.py:从resource/ysz/转换书籍数据,生成静态站点和配置文件。
已确认的核心机制
这些脚本的可移植方法论,核心在「分类映射 + 排序 + 脱敏」,而非花哨的解析:
- 系列名映射表(SERIES_MAP):用一张「原始目录名 → 系列名」的字典做分类,而不是靠解析文件名去猜。例:
'Lee8':'lee8'、'Nee':'nee'、'smdj8':'smdj8'、'books':'books'。目录名是这套内容特有的,映射表就是分类的唯一真相源。 - 系列标题映射(SERIES_TITLE_MAP):系列名 → 中文显示名。例:
'cxxl':'初信喂养'、'lee8':'李文集'、'smdj8':'生命读经'、'books':'职事书报'。 - 自然排序(natural_sort_key):把字符串按「数字 vs 非数字」切块排序,保证
'2'排在'10'前面,而不是字典序的'10' < '2'。这是章节/篇目顺序正确的关键。 - 敏感词替换(SENSITIVE_REPLACEMENTS):转换时做合规脱敏。例:
('李常受文集', '李文集')。这一步是在输出阶段做的,不影响源。 - 纯文本提取(extract_text):用 BeautifulSoup 遍历标签提取文本,配合时间戳日志(
logging)。
尚未核实的部分(诚实标注)
具体的章节边界切分规则(用什么词/正则把一整段文本切成「章 / 节 / 篇」)没有逐行读完,还不清楚它精确的分割关键词。但原理是确定的:挑「边界清晰」的标记(章节标题、篇目编号、空行、固定前缀)就能切。这是「convert 脚本」最核心也最不通用的一步——每套书源的边界词都不同,需要针对性地找。
可移植的落点
- 输出格式:统一转成 JSON manifest(
items: [{id, title, fileUrl, format}]),前端靠 manifest 发现内容,而不是硬编码路径。这也是clover2024/spiritual-app(内容在 COS)的books-manifest.json同款思路。 - 分类靠映射表、排序靠自然序、脱敏靠替换表——这三样几乎任何「文本 → 结构化内容」的批处理都能复用。
- 源文件大时 gitignore 掉,仓库里只留转换脚本 + 输出 manifest,这是再发布者的常见做法(也是溯源时「仓库里没原始 HTML」的原因)。
要点
- 电子书转换的本质不是「解析」,而是「分类映射 + 自然排序 + 边界切分 + 脱敏」。
- 章节边界切分是最不通用的一步:每套书源的边界词不同,需针对性找「边界清晰的标记」(编号、标题、空行)。
- 结构化输出(JSON manifest)让前端「按 manifest 发现内容」,比硬编码路径好维护、好分发。
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Python