通过python的ebooklib修改epub文件,但是<head>里面的所有内容都丢失了

Posted

技术标签:

【中文标题】通过python的ebooklib修改epub文件,但是<head>里面的所有内容都丢失了【英文标题】:modify epub file by python's ebooklib, but all the contents inside <head> was lost 【发布时间】:2021-05-09 16:25:43 【问题描述】:

我正在使用 python 电子书库 ebooklib 来修改一批 epub 文件。伪代码如下。

book = epub.read_epub(input_path)

page_add = epub.Epubhtml(title='index_add', file_name='index_add.html', lang='en')
page_add.content = u'''
<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <body>
        <div>
            I'm a new added page
        </div>
    </body>
</html>
'''
book.add_item(page_add)

book.spine.insert(1, page_add)

epub.write_epub(output_path, book, )

运行代码后,生成了一个新的 epub 文件,并在其中添加了新页面。问题是所有原始 epub 文件的原始内容都失去了样式

众所周知,epub 文件是由 HTML 文件组成的。我把文件扩展名从.epub改为.zip,然后unzip,就可以得到所有的HTML文件了。对这些文件挖了一会,发现样式丢失的原因是所有的样式表文件都位于所有原始HTML文件的&lt;head&gt;标签内,而新文件丢失了所有这些内容。 &lt;head&gt; 标签。原始的&lt;head&gt; 如下所示:

<head>
    <link href="../stylesheet.css" rel="stylesheet" type="text/css"/>
    <link href="../page_styles.css" rel="stylesheet" type="text/css"/>
</head>

ebooklib的doc,我找到了如下描述:

在定义内容时,您可以将其定义为有效的 HTML 文件,或者只是作为内容的 HTML 元素的一部分。它会忽略你在&lt;head&gt; 元素中的任何内容。

我认为这可能是&lt;head&gt;标签内所有内容丢失的原因。我不知道为什么 ebooklib 会这样做。有没有人有办法解决它?我认为我的要求很普遍。只需将一个页面添加到许多现有的 epub 文件中。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

这里是 Ebooklib 的作者。使用 Ebooklib 执行此操作的唯一正确方法是读取 EPUB 文件并通过从原始文件中挑选您需要的内容从头开始构建新的 EPUB。你永远不应该读取文件、修改它并写下来,因为我们希望始终以有效的 EPUB3 结束,而我们的方法是“我将忽略所有垃圾元数据、额外文件,只取我需要的并保留我的布局文件夹”。

话虽如此,那是针对我们开发的在线出版系统而言的。在系统之外使用 Ebooklib 能够做这样的事情确实很有意义。我目前不确定需要进行多少更改。会看的。

亚历山大

【讨论】:

嗨@aerkalov,感谢您的反馈。我想我可以迭代所有样式表/js 文件并将它们再次组合成 HTML 文件。只是一个问题,有没有办法从原始 HTML 文件中获取 标记内的内容?显然,get_content() 方法会丢失 标签内的所有内容。

以上是关于通过python的ebooklib修改epub文件,但是<head>里面的所有内容都丢失了的主要内容,如果未能解决你的问题,请参考以下文章

使用 ebooklib 时如何更改封面文件中的 html?

txt怎么转epub

如何将txt格式的电子书转换成epub格式

将电子书从txt格式转换成epub格式的软件?

EPUB书籍阅读器插件分享

Adobe Digital Editions打开epub书籍文件,中文都是乱码问题的解决