news 2026/10/11 12:59:19

EPUB如何秒变Markdown?zlibrary-to-notebooklm电子书转换核心代码全拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EPUB如何秒变Markdown?zlibrary-to-notebooklm电子书转换核心代码全拆解

【免费下载链接】zlibrary-to-notebooklm

一键将 Z-Library 书籍自动下载并上传到 Google NotebookLM

项目地址:https://gitcode.com/gh_mirrors/zl/zlibrary-to-notebooklm
点击查看免费下载

还在手动把 EPUB 书籍转成 Markdown 吗?开源项目zlibrary-to-notebooklm只需一条命令,就能把 Z-Library 上的电子书自动下载、转换为 Markdown,并一键上传到 Google NotebookLM 变成你的 AI 知识库。本文将拆解它 EPUB 转 Markdown 的核心代码,帮你搞懂整个转换机制。

为什么要把 EPUB 转成 Markdown?

在 完整工作流程 中,格式处理的优先级是:

  1. PDF⭐ —— 保留排版,直接上传
  2. EPUB—— 转换为 Markdown(对 AI 检索最友好)
  3. 其他格式—— 自动处理

为什么偏偏是 Markdown?因为 NotebookLM 基于文本做检索和问答,HTML 里混杂的标签、脚本、样式噪声会让 AI "读得费劲"。而 Markdown 干净、结构化,章节标题就是#,正文就是纯文本——这正是 AI 最擅长的格式。

核心转换文件一览

整个转换逻辑集中在 scripts/convert_epub.py,只有约 195 行,由两个函数组成:

函数位置作用
epub_to_markdown()convert_epub.py#L121打开 EPUB,提取元数据和全部章节
html_to_markdown()convert_epub.py#L13递归遍历 HTML 节点,逐个映射为 Markdown

两个库是它的地基:ebooklib负责解包 EPUB,BeautifulSoup负责解析 HTML。依赖声明在 requirements.txt 中。

第一步:解包 EPUB,读取元数据

EPUB 本质是一个 ZIP 压缩包,ebooklib的read_epub()一句话就能打开它。接下来从 DC 元数据里取出书名和作者,写入 Markdown 文件头部:

title = book.get_metadata('DC', 'title')[0][0] author = book.get_metadata('DC', 'creator')[0][0] markdown_content = f"# {title}\n\n" markdown_content += f"**Author:** {author}\n\n"

这样生成的文件自带标题和作者信息,上传到 NotebookLM 后一眼就能认出是哪本书。

第二步:只挑正文,过滤"垃圾"页面

EPUB 里的文件五花八门:正文、封面、脚本、CSS……如何区分?关键在 convert_epub.py#L144:

for item in book.get_items(): if item.get_type() == 9: # ITEM_DOCUMENT = 9

ebooklib 给每类内容定义了数字类型码,9 代表文档(HTML 正文),其他类型一律跳过。这是第一层过滤,保证只处理真正的章节文件。

第三步:递归遍历,逐节点转成 Markdown

这是全文件最精华的部分——process_element()函数(convert_epub.py#L17)用递归实现了一个"HTML→Markdown 翻译器",规则按优先级依次判断:

🗑️ 先丢弃:脚本、样式、导航

if element.name in ['script', 'style', 'nav', 'footer', 'svg']: return ""

这些标签对阅读毫无意义,直接返回空字符串,一步到位地降噪。

🔤 再映射:每种标签对应一种 Markdown 语法

HTML 标签转换结果源码位置
h1~h6#~######级标题convert_epub.py#L31-L36
p独立段落(前后空行)convert_epub.py#L39-L43
b/strong**加粗**convert_epub.py#L46-L50
i/em*斜体*convert_epub.py#L53-L57
code`行内代码`convert_epub.py#L60-L64
a文字convert_epub.py#L67-L72
ul- 无序列表convert_epub.py#L75-L82
ol1. 有序列表convert_epub.py#L84-L91

标题的转换特别巧妙:int(element.name[1])从标签名里直接解析出级别,'#' * level拼出对应数量的井号,六种标题一次搞定。

🧩 最后兜底:递归处理子节点

遇到未显式处理的标签(比如div、section),就遍历它的子节点继续递归:

for child in element.contents: result += process_element(child)

这种"显式规则 + 递归兜底"的组合,既保证了常见标签的精确转换,又能应对任意嵌套结构——无论 EPUB 里的 HTML 写得多乱,都能兜住。

第四步:清洗空行,合并成完整 Markdown

递归结束后,原始输出往往空行过多。convert_epub.py#L114-L116 用两个正则做最后收尾:

  • 连续 4 个以上换行压缩成 3 个
  • 多余空格合并为一个

细节加分项:100 字符阈值

注意 convert_epub.py#L153 这行判断:

if len(chapter_md.strip()) > 100:

转换结果少于 100 字符的"章节"(通常是空白页、版权页)会被直接丢弃。配合第一层的类型过滤,最终留下的都是干货正文,每章之间用---分隔线隔开。

转换完成后,发生了什么?

convert_epub.py并不是孤立运行的。在主流程 scripts/upload.py 的convert_to_txt()(upload.py#L453-L495)中:

  1. 检测到.epub文件后,自动调用convert_epub.py生成.md
  2. 统计 Markdown 的词数
  3. 超过 35 万词?自动按章节分块——因为 NotebookLM CLI 对大文件容易超时,分块后逐块上传同一个笔记本,既规避限制又保持内容完整
  4. 调用notebooklm create创建笔记本、notebooklm source add上传内容

也就是说,一次 EPUB 转换的终点不是一份 .md 文件,而是一个可以立即向 AI 提问的笔记本。整个链路在 docs/WORKFLOW.md 中有完整流程图。

快速上手:三步跑通全流程

git clone https://gitcode.com/gh_mirrors/zl/zlibrary-to-notebooklm cd zlibrary-to-notebooklm pip install -r requirements.txt
# 1. 首次登录(保存会话,后续免登录) python3 scripts/login.py # 2. 一条命令:下载 + 转 Markdown + 上传 python3 scripts/upload.py "https://zh.zlib.li/book/..."

如果只想要 EPUB 转 Markdown 这个能力,单独跑转换脚本也可以:

python3 scripts/convert_epub.py book.epub [output.md]

写在最后

zlibrary-to-notebooklm 用不到 200 行代码演示了一个干净利落的 EPUB→Markdown 方案:类型码过滤 + 递归标签映射 + 正则清洗,三层过滤层层降噪。这套思路不依赖重型转换库,逻辑透明、易于魔改——想支持新标签?在process_element()里加一个分支即可。

如果你也被"下载书 → 转格式 → 手动上传"的流程折腾过,不妨试试这条自动化链路。更多细节可参考:

  • 工作流程详解:docs/WORKFLOW.md
  • 故障排除指南:docs/TROUBLESHOOTING.md
  • 安装指南:INSTALL.md
  • Skill 定义:SKILL.md

⚖️ 本项目仅供学习研究,请仅处理你拥有合法访问权限的内容,尊重知识产权,支持正版阅读。

【免费下载链接】zlibrary-to-notebooklm

一键将 Z-Library 书籍自动下载并上传到 Google NotebookLM

项目地址:https://gitcode.com/gh_mirrors/zl/zlibrary-to-notebooklm
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 12:58:29

高性价比人生指南网盘

今天给大家挖到一份《高性价比人生指南》电子版,共388页(可下载) https://pan.baidu.com/s/1yc1Vhzx6NOXn_4FhmUwDPA?pwd42a7

作者头像 李华
网站建设 2026/10/11 12:57:28

OFD在线预览私有化部署实战:Java技术栈从解析到渲染

不知道你有没有遇到过这种情况:收到一封带 .ofd 附件的邮件,双击打开却提示"没有关联的应用";或者财务那边拿到一张数电票,明明是 OFD 版式,想在浏览器里直接预览,结果只能让每个人都装一个笨重的…

作者头像 李华
网站建设 2026/10/11 12:57:25

C语言字符串逆序实战:函数传参、指针运算与工程化实现

C经典100例练到第43题,说实话已经过了最容易劝退的阶段。前面那些变量、循环、数组题目做完,基本语法都摸过一遍了,这一题开始转向“函数指针字符串处理”的综合运用,需要你从“写代码能跑”过渡到“写代码有章法”。第43题的题目…

作者头像 李华
网站建设 2026/10/11 12:56:46

STL list容器深度解析:双向链表、迭代器失效与性能误区

说到STL里的list容器,估计不少人都经历过这么个阶段:刚开始学C的时候,被各种资料安利“链表插入删除效率高”,于是遇到需要频繁增删的场景就条件反射地掏出list,结果跑起来发现性能还不如vector,心里一阵问…

作者头像 李华
网站建设 2026/10/11 12:53:54

Kubernetes 上跑 Java 服务:Quarkus 与 HBase 组合实战

别人问我为什么在Kubernetes上跑Java服务,最后绕不开Quarkus和HBase这个组合。这俩放一起,乍一看一个是云原生Java框架,一个是老牌分布式列式数据库,好像没什么交集。但真在K8s里把有状态的HBase集群和无状态的Java服务编排到一起…

作者头像 李华
网站建设 2026/10/11 12:53:53

SAR成像PFA算法实战:正视与斜视的Python实现及避坑指南

简介:这份资源面向雷达信号处理方向的学习者与研究人员,聚焦合成孔径雷达(SAR)成像中的极坐标格式算法(PFA)实现,解决从原始回波数据到聚焦成像的完整链路问题。内容基于走停模式生成SAR回波数据…

作者头像 李华