用Kindle看亚马逊商店里的书还好, 但是用它看网页上在线阅读的书籍或者txt格式的文档体验就不怎么样了.
当然你可以直接在网上查找mobi格式的资源并下载, 但是资源毕竟没有这么好找(况且我们怎么可以这么Low呢!!).

我们可以换个思路, 将网页上的小说抓取出来, 自行生成mobi格式文档供Kindle享用.

OS: Deepin Linux 15.11 stable

抓取书籍内容

前段时间随手翻到了一本叫《南宋第一卧底》的网文, 就用它来开开牙祭吧.

在度娘上搜索到了包含这本书的一个在线阅读网站, 其中这本书的网址为https://www.booktxt.com/20_20966/. 用wget递归下载下所有的章节页面.

wget -r https://www.booktxt.com/20_20966/\*

然后就发现wget要把整个网站都下下来… 如果发现wget下载的已经不是”20_20966/…”的网页, 那说明已经下载完当前书籍了, 直接中止下载.
进入www.booktxt.com/20_20966/目录随便cat出一个网页的内容看看(比如cat index.html), 发现乱码.
乱码原因是我的系统使用的是UTF-8编码, 而这个网站的网页使用GBK编码. 所以读取页面内容后需要用iconv进行转码再查看/提取内容(cat *.html | iconv -f GBK -t UTF-8). 当然如果直接用支持GBK的编辑器也可以直接查看.
查看后发现所有章节标题都放在<h1>标签里, 小说内容都放在<div id="content">标签里, 而且小说内容与’

‘在同一行中 所以可以用按行检索工具grep提取之.

for i in `ls -v`  # 以数字从小到达排序方式遍历所有文件
  do
  cat $i | iconv -f GBK -t UTF-8 | grep '<div id="content">\|<h1>' >> ../../book.ori  # grep后面用的'\|'表示或者
  echo '---' >> ../../book.ori # 这步不是必须的, 加入'---'后Kindle会在章节之间形成分隔线
  done

第二种提取方式

如果你觉得上面的方法不够优雅, 会把一些杂七杂八的东西下载下来, 则可以遍历index.html, 筛选出来其中各章节的链接单独下载.

wget https://www.booktxt.com/20_20966/index.html
cat index.html | iconv -f GBK -t UTF-8 | grep '<dd>' | \
sed 's/<dd>\|<\/dd>/\n/g' | sed 's/<\/a>\|" class="empty//g' | \
sed 's/<a href="/https:\/\/www.booktxt.com/g' | \
sed 's/">/\&nbsp;/g' > link
mkdir originbook
mv index.html originbook
for i in `cat link`
  do
  echo $i | sed 's/\&nbsp;/ /g' | cut -d' ' -f2 >> book.ori
  wget `echo $i | sed 's/\&nbsp;/ /g' | cut -d' ' -f1`
  cat *.html | iconv -f GBK -t UTF-8 | grep '<div id="content">' >> book.ori
  mv *.html originbook
  echo '---' >> book.ori
  done

如果前面执行wget https://www.booktxt.com/20_20966/, iconv -f GBK -t UTF-8很有可能会报错:iconv: 未知 1 处的非法输入序列. 我不清楚这是为什么, 可能是这样下载index.html时候会混入什么东西导致iconv无法正确识别字符.

文字处理

sed 's/\t*<div id=\"content\">//g' book.ori > book.div.html # \t表示制表占位符Tab, \t*表示零个或者多个Tab
sed 's/\&nbsp;//g' book.div.html > book.nbsp.html
sed 's/<\/div>//g' book.nbsp.html > book.div.html
sed -r 's/(<br \/>)+/\n/g' book.div.html > finish.txt  # (<br \/>)+表示一个或者多个<br />
rm book*
mv finish.txt book.txt

如果报错, 可能是sed识别不了当前的正则表达式, 可以将sed命令变为LANG=C sed -r '...' ... > ...试试.

格式转换

这一步用到软件Calibre, 可以直接去应用商店找, 也可以sudo apt install calibre -y.
然后点添加书籍, 将前一步生产的book.txt加入书库, 选定book.txt后点转换书籍, 输出格式为mobi, 确定, 然后等待转换完成(可能会有点慢), 从~/Calibre*/找到对应书籍的目录, 找到mobi文件导入Kindle即可.



software shell

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!