Python库提取“epub”信息

26

我想在Python中创建一个上传电子书至iBook的Epub上传器。我需要一个Python库来提取图书信息。在自行实现之前,我想知道是否有已经制作好的Python库可以实现该功能。


3
我支持保持此问题开放,因为在提问时似乎没有库可以实现所需功能,而且我认为被采纳的答案包含有价值的代码。 - Gustav Bertram
这条评论不是针对你的,而是针对投票关闭问题的人。没有理由取消接受答案,特别是它解决了你的问题。 - Gustav Bertram
关闭并不意味着删除,答案可能是吸引链接回答或者未来的垃圾信息。 - bummi
4个回答

49

一个.epub文件是一个经过zip编码的文件,其中包含一个META-INF目录,该目录包含一个名为container.xml的文件,该文件指向另一个通常名为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'
}

两个链接都失效了。 - OliasailO
果然,epub 是一种不同扩展名的压缩文件。 :) - Brōtsyorfuzthrāx
有没有一种方法可以获取书本本身的内容? - ScipioAfricanus

3

比如像epub-tools这样的工具?但那主要是关于编写epub格式(从各种可能的来源),就像epubtools一样(拼写相似,但是是不同的项目)。对于阅读它,我会尝试使用配套项目threepress,这是一个用于在浏览器上显示epub书籍的Django应用程序--虽然我没有看过那个代码,但我想为了展示这本书,它肯定必须首先能够阅读它;-)。


epub-tools和epubtools似乎是epub生成器。 - xiamx
1
@xiamx,是的,“主要是关于写作”,正如我所说--那么,你尝试过threepress代码了吗? - Alex Martelli

1

看看epub模块。它似乎是一个简单的选择。


1
这个软件包似乎没有得到很好的维护。 - ninjaboy

0

在寻找类似内容后,我来到了这里,并受到Bothwell先生代码片段的启发,开始了自己的项目。如果有人感兴趣... http://epubzilla.odeegan.com/


非常有用的链接。 - embert
因为网站无法加载而被踩,我猜这个项目被放弃了。 - OMY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接