制作网络小说的电子书
目录
最近一直在使用“追书神器”看小说,不过新版的“追书神器”不再提供免费网站,千万不要更新。 身为资深网络小说迷,怎能受制于人。
另外,手机屏幕太小,阅读体验远比不上 Kindle 之类的电纸书。 是时候自己动手写个工具,将网络小说制成电子书,便于放到 Kindle 上阅读了。
目标
制作电子书需要下面几个步骤:
- 找到小说
- 下载小说
- 用下载的内容制作电子书
当前只开发了下载小说的工具,支持从固定的网站下载小说。 而制作电子书则通过 calibre 软件实现。 下面就介绍下载小说的工具。
下载小说
下载小说分为两步:找目录、按目录下载每个章节。
我使用 requests 获取网页,使用 beautiful soup 解析和输出 HTML 文件。
目前仅针对无图小说网开发下载工具。同样的思路也适用于其它小说网站。
获取目录
从小说目录页面获取目录链接列表,请看下面的函数
def get_contents(url) -> list:
response = requests.get(url, proxies=proxies)
bs_object = BeautifulSoup(response.content, "html.parser")
table_node = bs_object.select('dd > table')
link_nodes = table_node[0].findAll('a')
contents = []
for a_link in link_nodes:
if 'href' not in a_link.attrs:
continue
href = a_link['href']
link = urljoin(url, href)
contents.append({
'name': a_link.string,
'link': link
})
return contents
下载小说章节
从每个章节页面获取章节内容,并组成新的HTML字符串,请看下面的函数。
def get_novel_chapter(url) ->str:
response = requests.get(url, proxies=proxies)
bs_object = BeautifulSoup(response.content, "html.parser")
title_node = bs_object.select_one('#a_main h1')
content_node = bs_object.select_one('#contents')
paragraphs = content_node.strings
html_chapter = BeautifulSoup("
<html>
<head>
</head>
<body>
<div>
<div>
<p></p>
</div>
</div>
</body>
</html>", "html5lib")
main_div = html_chapter.div
html_title_node = html_chapter.new_tag('h1')
html_title_node.string = title_node.string
main_div.append(html_title_node)
html_content_node = html_chapter.new_tag('div')
main_div.append(html_content_node)
for a_paragraph in paragraphs:
p_text = a_paragraph.string.strip()
p_node = html_chapter.new_tag('p')
p_node.string = p_text
html_content_node.append(p_node)
return html_chapter.prettify()
保存HTML文件
最后,将字符串保存成 HTML 文件。
chapter_html = get_novel_chapter(link)
chapter_html_file_path = 'some path'
with open(chapter_html_file_path, "w", encoding="utf-8") as f:
f.write(chapter_html)