Python – Ebooklib 读写 epub 电子书
文章目录
一、关于 Ebooklib
Ebooklib 用于管理 EPUB2/EPUB3 文件。
二、读取 EPUB
import ebooklib
from ebooklib import epub
book = epub.read_epub('test.epub')
有一个ebooklib.epub.read_epub()
函数 用于读取EPUB文件, EPUB文件全路径作为参数,返回ebooklib.epub.EpubBook
类的实例。
1、元信息
ebooklib.epub.EpubBook.get_metadata()
方法用于获取元信息。
它接受2个参数,第一个是命名空间的名称(DC
表示Dublin Core,OPF
表示自定义元信息)。第二个参数是键的名称。
它总是返回一个列表。如果没有为该键定义任何内容,列表将为空。
对于EPUB3,来自Dublin Core集所需的最小元信息为:
访问 Dublin Core 元信息时,使用DC命名空间。
>>> book.get_metadata('DC', 'title')
[('Ratio', {})]
>>> book.get_metadata('DC', 'creator')
[('Firstname Lastname ', {})]
>>> book.get_metadata('DC', 'identifier')
[('9781416566120', {'id': 'isbn_9781416566120'})]
Dublin Core集的可选择的元信息有:
下面是 Dublin Core核心元信息在 content. opf
文件内部的定义方式。
<dc:language>en</dc:language>
<dc:identifier id="isbn_9781416566120">9781416566120</dc:identifier>
您还可以有自定义元信息。
对于实例,这就是content. opf
文件中定义 自定义元信息的方式。
您可以多次定义相同的键。
<meta content="my-cover-image" name="cover"/>
<meta content="cover-image" name="cover"/>
访问自定义元信息时,您将使用命名空间OPF
。
请注意,您现在将获得不止一个结果。
>>> book.get_metadata('OPF', 'cover')
[(None, {'content': 'my-cover-image', 'name': 'cover'}),
(None, {'content': 'cover-image', 'name': 'cover'})]
查看官方留档了解更多信息:
2、item
所有资源(样式表、图像、视频、声音、脚本和html文件)都是项目(items)。
images = book.get_items_of_type(ebooklib.ITEM_IMAGE)
使用ebooklib.epub.EpubBook.get_items_of_type()
拉取数据项的类型。
以下是您可以使用的 当前项目类型列表:
cover_image = book.get_item_with_id('cover-image')
使用ebooklib.epub.EpubBook.get_item_with_id()
通过 id(如果你知道)拉取数据项。
index = book.get_item_with_href('index.xhtml')
使用ebooklib.epub.EpubBook.get_item_with_href()
通过文件名拉取数据。
items = book.get_items_of_media_type('image/png')
使用ebooklib.epub.EpubBook.get_items_of_type()
通过媒体类型拉取数据。
all_items = book.get_items()
使用 ebooklib.epub.EpubBook.get_items()
返回所有项目。
这是你最常用的 处理未知EPUB文件方法。
重要的是要记住!方法 get_item_with_id
,get_item_with_href
将返回项目对象。
方法 get_items_of_type
,get_items_of_type
和 get_items
将返回迭代器(而不是列表)。
要从现有项目中获取内容(关于它是图像、样式表还是html文件),您可以使用 ebooklib.epub.EpubItem.get_content()
。
对于超文本标记语言项,您也使用 ebooklib.epub.EpubHtml.get_body_content()
。
有什么区别?get_content
总是 返回文件的全部内容,而 get_body_content
只返回超文本标记语言文档的<body>
部分中的任何内容。
for item in book.get_items():
if item.get_type() == ebooklib.ITEM_DOCUMENT:
print('==================================')
print('NAME : ', item.get_name())
print('----------------------------------')
print(item.get_content())
print('==================================')
三、创建EPUB
from ebooklib import epub
book = epub.EpubBook()
EPUB有一些 您需要满足的 最小元信息要求。
您需要定义唯一标识符、书名 当谈到语言代码时,推荐的最佳实践是使用受控词表,如RFC 4646 -http://www.ietf.org/rfc/rfc4646.txt 。
book.set_identifier('sample123456')
book.set_title('Sample book')
book.set_language('en')
book.add_author('Aleksandar Erkalovic')
您还可以添加自定义元信息。
第一个来自Dublin Core命名空间,第二个纯粹是自定义的。
book.add_metadata('DC', 'description', 'This is description for my book')
book.add_metadata(None, 'meta', '', {'name': 'key', 'content': 'value'})
这就是我们的自定义元信息,在 content.opf
文件中的效果。
<dc:description>This is description for my book</dc:description>
<meta content="value" name="key"></meta>
章节由ebooklib.epub.EpubHtml
。
章节用ebooklib.epub.EpubHtml
表示。
您必须定义文件名和标题。在我们的例子中,标题将在生成目录时使用。
定义内容时,您可以将其定义为有效的HTML文件,或您作为内容的HTML元素的一部分。
它将忽略您在<head>
元素中的任何内容。
# intro chapter
c1 = epub.EpubHtml(title='Introduction',
file_name='intro.xhtml',
lang='en')
c1.set_content(u'<html><body><h1>Introduction</h1><p>Introduction paragraph.</p></body></html>')
# about chapter
c2 = epub.EpubHtml(title='About this book',
file_name='about.xhtml')
c2.set_content('<h1>About this book</h1><p>This is a book.</p>')
做一些基本的调试,看看什么样的内容最终会出现在书中。
在这种情况下,我们插入了章节的标题和语言定义。
如果我们将样式表文件附加到本章,它还将添加指向样式表文件的链接。
>>> print(c1.get_content())
b'<?xml version=\'1.0\' encoding=\'utf-8\'?>\n<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:epub="http://www.idpf.org/2007/ops" epub:prefix="z3998: http://www.daisy.org/z3998/2012/vocab/structure/#"
lang="en" xml:lang="en">\n <head>\n <title>Introduction</title>\n </head>\n <body>\n <h1>Introduction</h1>\n
<p>Introduction paragraph.</p>\n </body>\n</html>\n'
任何类型的项目(样式表、图像、HTML 文件)都必须添加到书中。
book.add_item(c1)
book.add_item(c2)
您可以将任何类型的文件添加到书中。
对于实例,在这种情况下,我们添加样式表文件。
我们为它定义文件名、唯一ID、media_type和内容。
就像您需要将其添加到书中的章节文件一样。样式表文件也可以添加到章节中。
在这种情况下,链接将自动添加到 HTML 章节中。
style = 'body { font-family: Times, Times New Roman, serif; }'
nav_css = epub.EpubItem(uid="style_nav",
file_name="style/nav.css",
media_type="text/css",
content=style)
book.add_item(nav_css)
必须手动定义目录。ToC是元素的元组/列表。
您可以使用 ebooklib.epub.Link
手动定义链接,或只是插入项目对象。
当你手动插入时,你可以定义 ToC中 不同的的标题,而不是章节中的标题。
如果您只是插入item对象,它将使用您创建该项目时 定义的任何标题 。
节只是有两个值的元组。
第一个是节的标题,第二个是带有子章节的元组/列表。
book.toc = (epub.Link('intro.xhtml', 'Introduction', 'intro'),
(
epub.Section('Languages'),
(c1, c2)
)
)
所以作为书脊(Spine)。您可以为项目使用唯一的ID,或者只是将它的实例添加到书脊中。
book.spine = ['nav', c1, c2]
最后,我们需要添加NCX和导航链接(Navigation tile)。它们不会自动添加。
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
最后写下你的书。你需要指定书的完整路径,你不能把它写到文件对象或其他东西。
epub.write_epub('test.epub', book)
它还接受一些选项。
选项 | 默认值 |
---|---|
epub2_guide | True |
epub3_landmark | True |
epub3_pages | True |
landmark_title | “Guide” |
pages_title | “Pages” |
spine_direction | True |
package_direction | False |
play_order | {‘enabled’: False, ‘start_from’: 1} |
覆盖默认选项时的示例:
epub.write_epub('test.epub', book, {"epub3_pages": False})
2024-06-06(四)
作者:AI工程化