python epub.js_如何利用Python打包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格式电子书就制作完成了,以上内容只是我个人的想法和做法,欢迎大家一起加入讨论,另附:今天,你变得更博学了吗?
python epub.js_如何利用Python打包HTML页面为epub?相关推荐
- Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略
Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名.合并两个不同路径下图片文件名等目录/路径案例.正确加载图片路径)之详细攻略 目录 利用python ...
- Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...
- 用python做数据分析pdf_利用python进行数据分析pdf
利用python进行数据分析pdf微盘下载!<利用python进行数据分析>利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接 ...
- Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件
Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...
- python epub 精品_如何利用Python打包HTML页面为epub?
最近沉迷于将各种博客和官方文档html转化成pdf,结果用手机看还是不太方便,所以想到将html转化成epub格式的电子书,要用os,re,requests,lxm,zipfile,五个库,在这里分享 ...
- python里的resize_利用python之wxpy模块玩转微信!这部小儿科吗!
wxpy也是一个python的模块,利用它我们可以做很多有意思的事情 首先利用一句代码我们就可以利用python登录网页版微信 bot = Bot(cache_path= True) 这条语句会产生一 ...
- python音频聚类_利用python的KMeans和PCA包实现聚类算法
题目: 通过给出的驾驶员行为数据(trip.csv),对驾驶员不同时段的驾驶类型进行聚类,聚成普通驾驶类型,激进类型和超冷静型3类 . 利用Python的scikit-learn包中的Kmeans算法 ...
- python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例
在写django项目的时候,有的数据没有使用模型管理(数据表是动态添加的),所以要直接使用mysql.前端请求数据的时候可能会指定这几个参数:要请求的页号,页大小,以及检索条件. "&quo ...
- python过去日期_利用python获取当前日期前后N天或N月日期的方法示例
前言 最近因为工作原因,发现一个Python的时间组件,很好用分享出来!(忘记作者名字了,在这里先感谢了),下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 ...
最新文章
- C#正则表达式获取组名,按照组名输出匹配内容
- outlook 突然发信不正常
- Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题
- Java死锁、活锁,悲观锁、乐观锁
- IBM致梁允超:乘着新技术东风 SaaS100+让汤臣“倍”加健壮
- php redis新增数据类型,Redis有哪几种数据类型
- oracle简体版,oracle|Navicat中文网站
- 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
- 简单的oracle备份恢复批处理文件 -- 转
- Python之 if-elif-else
- 解析Node.js通过axios实现网络请求
- easyui弹出加载遮罩层(转)
- System.Web.Mvc.UrlHelper的学习与使用
- 2022版首发,阿里Java开发手册(黄山版).PDF
- pip install -Uqq 是什么意思?
- 社会工程学工具集之钓鱼网站的制作
- python爬取上市公司年报信息_python3爬取巨潮资讯网的年报数据
- MFC ODBC数据库操作编程(二)
- 怎么调整图片大小会不变形?
- [电脑问题]新固态硬盘安装系统以及分区,reboot and select proper boot device的问题处理