html转化成epub格式的电子书

最近沉迷于将各种博客和官方文档html转化成pdf,结果用手机看还是不太方便,所以想到将html转化成epub格式的电子书,要用os,re,requests,lxm,zipfile,五个库,在这里分享下大概思路。我们的目标是太白金星博客园的python基础教程--太白教你学python,目录url:https://www.cnblogs.com/jin-xin/p/9076242.html。

第一步,利用requests库访问第一个目录url,用re或者lxml中的etree,获取目录中对应章节的url和标题。urls,names两个列表。示例代码如下:

import requests

from lxml import etree

import os

import re

from fake_useragent import UserAgent

headers = {'User-Agent': UserAgent().random}

r = requests.get(url=url, headers=headers)

r.encoding = r.apparent_encoding

html = etree.HTML(r.text)

lis = html.xpath('.//a[@target='_blank']')[1:]

urls = [i.xpath('@href')[0] for i in lis]

names = [i.text for i in lis]

第二步,for循环urls列表,利用requests库访问对应章节的url来,并用re对其进行处理,来获取我们需要放进epub的数据内容。(这里解释下为什么要用re不用etree,etree一般是用来获取格式化的标签的属性值,而re则是从html源代码上直接获取片段内容,在这里我们需要的就是网页源代码。)我们需要的是文本内容问html和示例图片img这两种数据,至于多余网页导航,侧边栏,评论,广告之类的通通不要。在这里发现获取到的图片标签的src都是网络url,而epub中只能从本地路径中导入,因此获取img标签的src属性值,将图片下载到本地文件夹中按数字编号保存文件名(1.png,2.png,3.png....),并用re.sub将文本html中的img的src属性替换成本地路径,将html写入本地文件前我们需要将其包裹在

标签中,并增加标签构成一个完整的网页,有需要还可以增加title标签。到这里,我们需要的数据就准备好了。示例代码如下:

nums = len(names)

num = 0

os.chdir('D:\藏书馆\小说')

img_num = 1

while num < nums:

r = requests.get(url=urls[num], headers=headers)

r.encoding = r.apparent_encoding

html = r.text

html = re.findall('(

',html,flags=re.S)[0]

imgs = re.findall('< img src='(.+?)' alt=''>',html)

print(len(imgs))

for i in imgs:

try:

r = requests.get(url=i, headers=headers)

with open(f'{img_num}.png', 'wb')as f:

f.write(r.content)

html = re.sub('< img src='(.+?)' alt=''>',f'< img src='../Images/{img_num}.png'>',html,1)

img_num += 1

except:

print(i)

name = names[num]

for tsstr in ':!~?:'.。,、?;:!·~()[]{}()【】{}':

name = name.replace(tsstr, '')

name=f'{num:<3}'+ ' ' + name

with open(f'{name}.html','w', encoding='utf-8')as f:

f.write(html)

num+=1

print(f'{name}下载完毕,当前下载进度:{num}/{nums}')

第三步,创建一个文件夹,把它压缩后就是我们的.epub文件了,当然不是现在就压缩啦!文件夹目录如下:

一级目录中有两个文件夹和一个文件,META-INF文件夹,OEBPS文件夹和mimetype文件。mimetype文件里面只写一行:application/epub+zip,NETA-INF文件夹中只有一个container.xml文件,内容是:

<?xml version='1.0' encoding='utf-8'?>

OEBPS文件夹中有Images文件夹,Text文件夹,和content.opf文件与toc.ncx文件。

Images文件夹中存放所有的img图片,Text文件夹中存放所有的html文件,content.opf文件是Images与Text中所有文件的一个清单,格式如下:

<?xml version='1.0' encoding='utf-8'?>

urn:uuid:758b33c6-6ddb-4d52-a91c-50b137b50ef3

en

[此处填写标题]

2020-11-04

......

......

toc.ncx文件是目录文件,格式如下:

<?xml version='1.0' encoding='UTF-8'?>

/p>

[此处填写标题]

一,Python介绍

1. python的出生与应用

2. python是什么编程语言。

3. python的优缺点。

4. python的种类。

二. python环境

......

这两个文件都可以利用os库一键生成,至此所有文件数据准备完毕。

第四步,利用zipfile库,和os库压缩文件合成.epub文件。一定要把mimetype文件第一个写入,再将其他固定文件(r'META-INF\container.xml',r'OEBPS\content.opf',r'OEBPS\toc.ncx')写入,最后将.html和.png文件逐个写入,示例代码如下:

import zipfile

import os

os.chdir(r'C:\Users\My\Desktop\新建文件夹')

epub = zipfile.ZipFile(r'C:\Users\My\Desktop\新建文件夹.epub','w')

epub.write('mimetype',compress_type=zipfile.ZIP_STORED)

print(os.listdir('.'))

for i in [r'META-INF\container.xml',r'OEBPS\content.opf',r'OEBPS\toc.ncx']:

epub.write(i, compress_type=zipfile.ZIP_DEFLATED)

for p in [r'.\OEBPS\Images', r'.\OEBPS\Text']:

for f in os.listdir(p):

print(os.path.join(p,f))

epub.write(os.path.join(p,f),compress_type=zipfile.ZIP_DEFLATED)

epub.close

至此,我们的epub格式电子书就制作完成了,以上内容只是我个人的想法和做法,欢迎大家一起加入讨论,另附:今天,你变得更博学了吗?

(0)

相关推荐