半自动加工了一本电子书

本文讨论半自动化手段,使用多种工具(git bash shell, total commander, grep, sed,还涉及到正则表达式、CSS、HTML),从多个网页加工出一本电子书的过程。纯技术讨论,书本身只作为技术讨论的案例和素材。所以,书是哪本不重要。

读大学本科的时候,读过一本小说,当时感觉惊为杰作。杀手和侠义的现代故事,反恐相关的,读得热血沸腾。后来很多年偶尔还会想起,但是当年买的纸质品已经不知道在哪个故纸堆里积灰,找不到了。

最近突然想到,为什么不自己做一本,留着以后有时间的时候重温呢。

1. HTML下载

电子版在 zlib 和 jiumodiary 都没有找到。在学校图书馆找到了纸质品,在本部储备库 在架上 , 本部中文文二储备库 ; I247/012,是作者自选集长篇小说中的一本。

用bing搜索引擎,找到一个,在这里。

https://yiduhkk.com/art_7589_7182.html

网站把这本书切成了79小节。提供TXT下载,需要注册,这条线索舍弃。

选中这79个链接,用 SingleFile保存成html。

看起来大概像下图这样。为清晰起见,在下图中,我只选择了部分链接,实际操作中所有79个链接都在其中。

2. 文件改名

保存的结果,文件名大致如下。

《苦界》 第1节 易读 (2_15_2023 5_29_04 PM).html
《苦界》 第2节 易读 (2_15_2023 5_29_18 PM).html

使用 Total Commander 批量改名。Ctrl-M,可以用正则表达式、可以去除文件名改为用序号,等等。

得到了以序号命名的文件名,如下。

01.html
02.html

3. 剪切部分文字

下载到的HTML文件中,有大量的内容不希望保存在电子书中,需要去除。计划用shell脚本调用 sed 和 grep,批量修改HTML的文件内容。在批量操作以前,先在命令行试验参数。

下图中,红框以及红框的顶部还有大量内容,需要去除。

使用正则表达式,在 git bash 中 执行

grep "<div class=ART>.*</div>" 11.html

检查输出的内容,确实是我期待的行,说明正则表达式无误。

grep -Po "<div class=ART>(.*)</div>" 11.html

只输出匹配的部分。

接下来,对所有79个HTML文件用shell批量执行上述命令。类似下面的代码,保存为go.sh,在git bash shell中执行。共79行,每行对应一个文件。

grep -Po "<div class=ART>(.*)</div>" 01.html > 1_01.html
grep -Po "<div class=ART>(.*)</div>" 02.html > 1_02.html
grep -Po "<div class=ART>(.*)</div>" 03.html > 1_03.html
grep -Po "<div class=ART>(.*)</div>" 04.html > 1_04.html

这个shell文件的生成,其中的01.html,02.html这些文件名,以及1_01.html中的01.html,复制自Total Commander。因为常用这个功能在我的 Total Commander中设置了快捷键,ctrl-f2。粘贴时在emacs中按列操作,M-x copy-rectangle-as-kill,M-x yank-rectangle(M-x是按Alt然后x,执行命令)。其余的部分每行是相同的,可以使用emacs按列复制和粘贴,也可以使用emacs宏编辑功能,f3录制宏,按住f4重复到最后共执行78次。也可以使用word或emacs按列编辑这一类的功能完成。

在 git bash shell中执行上述脚本,得到79个HTML文件,每个文件的内容都只有一个div,里面是这一节的文字。

4. 格式微调

用calibre Edit E-book功能把上述HTML文件制作成电子书。用浏览器上传至微信读书,格式糟糕得很。段落开头顶格了没空两字,文字太小,行间距和段落间距乱,目录也一塌糊涂。

以下,每次修改,都制作成电子书-上传至微信读书-手机和浏览器分别检查格式。在没有经验,不知道微信读书APP会如何呈现电子书格式时,只好改改试试。得到一些经验,可惜这些经验对我没有复用的价值,希望对你有用。

可以作为 cat、sed、管道、重定向、CSS、HTML 的应用实例。

4.1 <div class=ART> 和 </div> 换成 <p>

cat 1_01.html | sed 's/<div class=ART>/<p>/g' | sed 's/<\/div>/<\/p>/g'

4.2 首行缩进,段间距

cat 1_01.html | sed 's/<div class=ART>/<p style="text-indent:-2em;padding:2em">/g' | sed 's/<\/div>/<\/p>/g'

4.3 拼接成单一文件

$ cat 1.html >> 0.html
$ cat 2.html >> 0.html
$ cat 3.html >> 0.html
$ cat 4.html >> 0.html

以上,共79行,我使用emacs宏编辑帮助完成。

4.4 shell脚本 原型

$ cat 1_04.html | sed 's/<div class=ART>/<p style="text-indent:-2em;padding:2em">/g' | sed 's/<\/div>/<\/p>/g' | sed 's/<br>/<p style="text-indent:-2em;padding:2em">/g' > 4.html
$ cat 1.html >> 0.html; cat 2.html >> 0.html ; cat 3.html >> 0.html ; cat 4.html >> 0.html

4.5 shell脚本

cat 1_01.html | sed 's/<div class=ART>//g' | sed 's/<\/div>//g' | sed 's/<br>/<p style="text-indent:-2em">/g' | sed 's/<p style="text-indent:-2em"><\/b>/<\/b>/g'| sed '1i <p style="text-indent:-2em">' > 01.html
cat 1_02.html | sed 's/<div class=ART>//g' | sed 's/<\/div>//g' | sed 's/<br>/<p style="text-indent:-2em">/g' | sed 's/<p style="text-indent:-2em"><\/b>/<\/b>/g'| sed '1i <p style="text-indent:-2em">' > 02.html
…
cat 1_79.html | sed 's/<div class=ART>//g' | sed 's/<\/div>//g' | sed 's/<br>/<p style="text-indent:-2em">/g' | sed 's/<p style="text-indent:-2em"><\/b>/<\/b>/g'| sed '1i <p style="text-indent:-2em">' > 79.html
rm 0.html
cat 01.html >> 0.html
cat 02.html >> 0.html
…
cat 79.html >> 0.html

5 加目录

在 calibre edit ebook中的以下两个功能中的任意一个,制作电子书。

按以下流程,用 html tag b 作为标签,加目录。

6. 手动

在微信读书中最前面两个字是乱码,不够完美。可能微信读书APP对HTML的解读依赖于encode国别之类的。

试了几个方案,每种方案的乱码位置不同。最终发现,在最前面加了4个空格,完美。

电子书完美,等有时间的时候就可以看了。

加工过程接近2小时45分钟,写博客接近1小时。什么时候会有时间重读这部分精彩的小说呢?

 

Leave a Reply

Your email address will not be published. Required fields are marked *