提取'epub'信息的Python库

26 投票
4 回答
27009 浏览
提问于 2025-04-16 00:25

我正在尝试用Python创建一个可以上传epub格式电子书到iBook的工具。我需要一个Python库来提取书籍信息。在自己动手实现之前,我想知道有没有人知道已经存在的Python库可以做到这一点。

4 个回答

1

可以看看这个epub模块。看起来是个简单的选择。

3

类似于epub-tools这样的工具吗?不过这个主要是用来 epub格式的(可以从各种来源写),还有epubtools(拼写相似,但项目不同)。如果是想阅读的话,我建议可以试试它的配套项目threepress,这是一个Django应用,可以在浏览器上显示epub书籍——我没有看过那个代码,但我想为了能显示书籍,它肯定得先能读取它;-)。

49

.epub文件其实就是一种经过压缩的文件,里面包含一个叫做META-INF的文件夹。这个文件夹里有一个名为container.xml的文件,它指向另一个文件,通常叫做Content.opf。这个Content.opf文件的作用是列出构成电子书的所有其他文件的索引(这个总结是基于http://www.jedisaber.com/eBooks/tutorial.asp;完整规范可以在http://www.idpf.org/2007/opf/opf2.0/download/找到)。

下面的Python代码可以从一个.epub文件中提取基本的元信息,并将其以字典的形式返回。

import zipfile
from lxml import etree

def epub_info(fname):
    def xpath(element, path):
        return element.xpath(
            path,
            namespaces={
                "n": "urn:oasis:names:tc:opendocument:xmlns:container",
                "pkg": "http://www.idpf.org/2007/opf",
                "dc": "http://purl.org/dc/elements/1.1/",
            },
        )[0]

    # prepare to read from the .epub file
    zip_content = zipfile.ZipFile(fname)
      
    # find the contents metafile
    cfname = xpath(
        etree.fromstring(zip_content.read("META-INF/container.xml")),
        "n:rootfiles/n:rootfile/@full-path",
    ) 
    
    # grab the metadata block from the contents metafile
    metadata = xpath(
        etree.fromstring(zip_content.read(cfname)), "/pkg:package/pkg:metadata"
    )
    
    # repackage the data
    return {
        s: xpath(metadata, f"dc:{s}/text()")
        for s in ("title", "language", "creator", "date", "identifier")
    }    

示例输出:

{
    'date': '2009-12-26T17:03:31',
    'identifier': '25f96ff0-7004-4bb0-b1f2-d511ca4b2756',
    'creator': 'John Grisham',
    'language': 'UND',
    'title': 'Ford County'
}

撰写回答