提取'epub'信息的Python库
我正在尝试用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'
}