写在前面的话
相信很多的宅们看电子书是必不可少的一个项目,咱也不例外,只是有些书只能在线读,没有下载链接,总不能一页页的复制吧,不符合咱的行事风格,请出 Python帮咱们复制喽!
命名空间
大概分析了几个读书网站的源代码格式,找到一些基本规律,不能适用所有,看宅们的水平了,咱这里只是一般读书网站的代码处理
import requests
from lxml import etree
这两个差不多就够了,一个用来获取网页内容,一个用来分析Dom树结构,找到我们想要的章节内容
先来一个方法
def getHtmlByUrl(url):
rResponse = requests.get(url)
rResponse.encoding = "utf-8" #中文很多时候会出现乱码,尝试使用utf-8编码读取内容
rHtml = etree.HTML(rResponse.content) #text有时候取不到值,故这里使用content
return rHtml
根据 Url 来获取网页的内容,只有得到网页源代码,咱们才能取得想要的不是
定义几个初始化变量
因为我写了几个网站的,为了代码共享的方便,宅们没这个需求也可以直接把xpath语句写在代码中
baseUrl = "" #正常获取到的章节链接都是短链接,要拼接上网站域名才能正常获取每一章的内容,记得填写哦!
listPath = '//*[@id="list"]/dl/dd' #根据网页内容的不同,章节目录所在节点可能有差异,视情况修改
titlePath = "a/text()" #同上,视情况修改
hrefPath = "a/@href" #同上,视情况修改
contentPath = '//*[@id="content"]/text()' #同上,视情况修改
直接上代码
url = "http://..." #这里填上你想要复制的书目章节目录链接
html = getHtmlByUrl(url)
lstCapture = html.xpath(listPath)
for capture in lstCapture:
# 获取章节标题
aTitle = capture.xpath(titlePath)[0]
print(aTitle)
# 获取章节链接
aHref = capture.xpath(hrefPath)[0]
newUrl = baseUrl + aHref
#处理文章内容特殊链接,如果没有这个需求,可以把这个删除,具体链接样式和处理方式要看你的网页内容
if aHref.find('https') >= 0:
newUrl = aHref
print(newUrl)
newHtml = getHtmlByUrl(newUrl)
# 获取章节内容
newContent = newHtml.xpath(contentPath)
strContent = aTitle + '\n'
# 处理文章内容拼接成文本可读格式,不然出来的样子可能有点可读性不高
for strLine in newContent:
if strLine.strip() != "":
strContent += strLine.replace('\n','').replace('\r','') + '\n'
# 写入到文本文件
with open("yourBookName.txt", 'a', encoding='utf-8') as f:
f.write(strContent + '\n')
PS
这里提供一个参考,如果条件允许,还是支持宅们买纸质书来看比较爽,像我这们穷屌丝就只能想这些节省口袋的方式啦!