You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从EPUB中提取各章节<p>内容及对应CFI,优先Python实现方案

EPUB提取

标签及对应CFI实现方案

需求梳理

提取EPUB文件所有章节内<p>标签的文本内容,同时为每个段落生成全局唯一的EPUB CFI(Canonical Fragment Identifier)定位标识,无需自行实现CFI底层计算逻辑。

Python 优先实现方案

依赖安装

使用三个成熟的第三方库完成需求,无需自研CFI逻辑:

pip install ebooklib beautifulsoup4 epubcfi

示例代码

from ebooklib import epub
from bs4 import BeautifulSoup
from epubcfi import generate_cfi

# 读取EPUB文件
book = epub.read_epub("你的文件路径.epub", options={"ignore_ncx": False})
# 存储spine顺序映射:章节id对应spine索引
spine_index_map = {item[0]: idx for idx, item in enumerate(book.spine)}
result = []

# 遍历所有文档类型章节
for item in book.get_items_of_type(epub.ITEM_DOCUMENT):
    # 跳过不在spine中的辅助资源
    if item.id not in spine_index_map:
        continue
    spine_idx = spine_index_map[item.id]
    # 解析章节HTML
    soup = BeautifulSoup(item.content, "lxml")
    # 查找所有p标签,同时保留节点顺序
    p_tags = soup.find_all("p")
    for p_idx, p in enumerate(p_tags):
        # 生成章节内节点CFI,拼接spine索引前缀得到全本唯一CFI
        inner_cfi = generate_cfi(p)
        full_cfi = f"epubcfi(/6/{spine_idx*2 + 4}{inner_cfi[1:]})"
        result.append({
            "spine_index": spine_idx,
            "paragraph_index": p_idx,
            "content": p.get_text(strip=True),
            "cfi": full_cfi
        })

# 输出结果
for item in result:
    print(f"段落[{item['paragraph_index']}]: {item['content'][:30]}... CFI: {item['cfi']}")

方案说明

  • ebooklib负责EPUB文件结构解析、spine顺序读取、章节内容提取
  • epubcfi库直接基于DOM节点生成符合标准的CFI,无需理解底层CFI拼接规则
  • 生成的full_cfi可直接用于所有支持EPUB标准的阅读器定位对应段落

其他技术栈参考方案

  • Node.js 方案:使用epubjs库,内置CFI生成能力,调用rendition.getContents()获取章节DOM后,直接调用cfiFromElement(p_node)即可生成对应CFI
  • Calibre 插件方案:基于Calibre内置的Python API,使用calibre.ebooks.oeb.polish.container读取EPUB,调用calibre.ebooks.epub.cfi.generate模块生成CFI,适合需要和Calibre生态打通的场景

注意事项

生成全本CFI时必须拼接对应章节在spine中的位置前缀,仅基于单章节HTML生成的CFI无法跨章节唯一标识段落
遇到包含嵌套标签的<p>节点时,直接将<p>根节点传入CFI生成方法即可,无需处理内部子节点

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:06:05