最近沉迷于将各种博客和官方文档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?相关推荐

  1. Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略

    Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名.合并两个不同路径下图片文件名等目录/路径案例.正确加载图片路径)之详细攻略 目录 利用python ...

  2. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  3. 用python做数据分析pdf_利用python进行数据分析pdf

    利用python进行数据分析pdf微盘下载!<利用python进行数据分析>利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接 ...

  4. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  5. python epub 精品_如何利用Python打包HTML页面为epub?

    最近沉迷于将各种博客和官方文档html转化成pdf,结果用手机看还是不太方便,所以想到将html转化成epub格式的电子书,要用os,re,requests,lxm,zipfile,五个库,在这里分享 ...

  6. python里的resize_利用python之wxpy模块玩转微信!这部小儿科吗!

    wxpy也是一个python的模块,利用它我们可以做很多有意思的事情 首先利用一句代码我们就可以利用python登录网页版微信 bot = Bot(cache_path= True) 这条语句会产生一 ...

  7. python音频聚类_利用python的KMeans和PCA包实现聚类算法

    题目: 通过给出的驾驶员行为数据(trip.csv),对驾驶员不同时段的驾驶类型进行聚类,聚成普通驾驶类型,激进类型和超冷静型3类 . 利用Python的scikit-learn包中的Kmeans算法 ...

  8. python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例

    在写django项目的时候,有的数据没有使用模型管理(数据表是动态添加的),所以要直接使用mysql.前端请求数据的时候可能会指定这几个参数:要请求的页号,页大小,以及检索条件. "&quo ...

  9. python过去日期_利用python获取当前日期前后N天或N月日期的方法示例

    前言 最近因为工作原因,发现一个Python的时间组件,很好用分享出来!(忘记作者名字了,在这里先感谢了),下面话不多说,来一起看看详细的介绍吧. 示例代码: # -*- coding: utf-8 ...

最新文章

  1. C#正则表达式获取组名,按照组名输出匹配内容
  2. outlook 突然发信不正常
  3. Matlab:单幅图象的暗原色先验去雾改进算法,能够很好地改进天空或明亮部分色彩失真问题
  4. Java死锁、活锁,悲观锁、乐观锁
  5. IBM致梁允超:乘着新技术东风 SaaS100+让汤臣“倍”加健壮
  6. php redis新增数据类型,Redis有哪几种数据类型
  7. oracle简体版,oracle|Navicat中文网站
  8. 新一代来袭︱不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?...
  9. 简单的oracle备份恢复批处理文件 -- 转
  10. Python之 if-elif-else
  11. 解析Node.js通过axios实现网络请求
  12. easyui弹出加载遮罩层(转)
  13. System.Web.Mvc.UrlHelper的学习与使用
  14. 2022版首发,阿里Java开发手册(黄山版).PDF
  15. pip install -Uqq 是什么意思?
  16. 社会工程学工具集之钓鱼网站的制作
  17. python爬取上市公司年报信息_python3爬取巨潮资讯网的年报数据
  18. MFC ODBC数据库操作编程(二)
  19. 怎么调整图片大小会不变形?
  20. [电脑问题]新固态硬盘安装系统以及分区,reboot and select proper boot device的问题处理

热门文章

  1. Spring Boot2.x 整合quartz集群
  2. 如何利用开源项目,帮助企业免费搭建小程序官网
  3. JEECG v3.0.beta发布,基于代码生成器的智能开发平台
  4. SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
  5. 稀疏表示字典的显示【MATLAB实现】
  6. R-CNN 最直观的理解
  7. Mysql面试常见知识点总结(一)
  8. bindService过程
  9. “3遍读书法” 我是这样自学编程的
  10. 【Python】07、python内置数据结构之字符串