【免费下载链接】zlibrary-to-notebooklm
一键将 Z-Library 书籍自动下载并上传到 Google NotebookLM
还在手动把 EPUB 书籍转成 Markdown 吗?开源项目zlibrary-to-notebooklm只需一条命令,就能把 Z-Library 上的电子书自动下载、转换为 Markdown,并一键上传到 Google NotebookLM 变成你的 AI 知识库。本文将拆解它 EPUB 转 Markdown 的核心代码,帮你搞懂整个转换机制。
为什么要把 EPUB 转成 Markdown?
在 完整工作流程 中,格式处理的优先级是:
- PDF⭐ —— 保留排版,直接上传
- EPUB—— 转换为 Markdown(对 AI 检索最友好)
- 其他格式—— 自动处理
为什么偏偏是 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 = 9ebooklib 给每类内容定义了数字类型码,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 |
ol | 1. 有序列表 | 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)中:
- 检测到
.epub文件后,自动调用convert_epub.py生成.md - 统计 Markdown 的词数
- 超过 35 万词?自动按章节分块——因为 NotebookLM CLI 对大文件容易超时,分块后逐块上传同一个笔记本,既规避限制又保持内容完整
- 调用
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
相关推荐
如何用markitdown将EPUB电子书转换为完美Markdown笔记
如何用markitdown将EPUB电子书转换为完美Markdown笔记 还在为无法高效整理电子书内容而烦恼吗?markitdown作为一款强大的Python工
人工智能AI 应用MCP 服务如何用zlibrary-to-notebooklm把Z-Library书籍自动上传NotebookLM?零基础实战指南
如何用zlibrary to notebooklm把Z Library书籍自动上传NotebookLM?零基础实战指南 zlibrary to notebook
Shiori 如何把网页变成 EPUB 电子书与模糊背景缩略图:图像处理代码拆解
Shiori 如何把网页变成 EPUB 电子书与模糊背景缩略图:图像处理代码拆解 Shiori 是一个用 Go 语言构建的极简书签管理器(Simple book
后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考