通过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文件的<head>
标签内,而新文件丢失了所有这些内容。 <head>
标签。原始的<head>
如下所示:
<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 元素的一部分。它会忽略你在
<head>
元素中的任何内容。
我认为这可能是<head>
标签内所有内容丢失的原因。我不知道为什么 ebooklib 会这样做。有没有人有办法解决它?我认为我的要求很普遍。只需将一个页面添加到许多现有的 epub 文件中。
我们将不胜感激。
【问题讨论】:
【参考方案1】:这里是 Ebooklib 的作者。使用 Ebooklib 执行此操作的唯一正确方法是读取 EPUB 文件并通过从原始文件中挑选您需要的内容从头开始构建新的 EPUB。你永远不应该读取文件、修改它并写下来,因为我们希望始终以有效的 EPUB3 结束,而我们的方法是“我将忽略所有垃圾元数据、额外文件,只取我需要的并保留我的布局文件夹”。
话虽如此,那是针对我们开发的在线出版系统而言的。在系统之外使用 Ebooklib 能够做这样的事情确实很有意义。我目前不确定需要进行多少更改。会看的。
亚历山大
【讨论】:
嗨@aerkalov,感谢您的反馈。我想我可以迭代所有样式表/js 文件并将它们再次组合成 HTML 文件。只是一个问题,有没有办法从原始 HTML 文件中获取 标记内的内容?显然,get_content() 方法会丢失 标签内的所有内容。以上是关于通过python的ebooklib修改epub文件,但是<head>里面的所有内容都丢失了的主要内容,如果未能解决你的问题,请参考以下文章