首先实现以下两个功能:
小说搜索无结果以及小说搜索后的翻页。
这是目录搜索模块:
def shousuo(s1,S1):#搜索模块,s1 书名 S1页码
S1 = str(S1)#将数字转换成字符型
url1 = 'http://zhannei.baidu.com/cse/search?s=5513259216532962936&entry=1&q=' + s1 +'&p='+ S1+'&s=5513259216532962936&entry=1'
shousuo = requests.get(url1)
shousuo.encoding = 'utf-8'#将网页转换成utf—8
Shousuo = shousuo.text#将网页转换成文本形式
pattern1 = ''
iteams1 = re.findall(pattern1, Shousuo)
for a1 in iteams1:
print('书名:' + a1[1] + ' 网址:' + a1[0])
return iteams1
s1 为书名 S1 为页码。
主程序:
while 1:
print('请输入书名:')
s1 =input()
S1 = 0
ITEAM1 = shousuo(s1=s1, S1=S1)
print('请选择书:')
s2 = input()
url2 = ITEAM1[int(s2)-1][0]
ITEAM2 = mulu(url2=url2)
我们从主程序更改。
程序运行到:
ITEAM1 = shousuo(s1=s1, S1=S1)
会显示搜索结果的第一页书名目录。如果没有搜索到相关书籍,ITEAM1这个列表应该为空列表,只需要判断列表长度就可以了。
程序改为:
while 1:
print('请输入书名:')
s1 =input()
S1 = 0
ITEAM1 = shousuo(s1=s1, S1=S1)
if len(ITEAM1) == 0:
print('查无此书,请重新输入')
continue
print('请选择书:')
s2 = input()
url2 = ITEAM1[int(s2)-1][0]
ITEAM2 = mulu(url2=url2)
如果要翻页,选择下一页的书名列表,只需改变S1的值,我这定义s为上一页,x为下一页。
判断s2输入是否含有s或x就可以实现翻页功能。
程序改为:
while 1:
print('请输入书名:')
s1 =input()
S1 = 0
ITEAM1 = shousuo(s1=s1, S1=S1)
if len(ITEAM1) == 0:
print('查无此书,请重新输入')
continue
print('请选择书:')
while 1: #这里不光选择书,也涉及到翻页。可能要多次用到以下模块。所以在此加个循环。
s2 = input()
if s2 == 'x': #如果输入‘x’ 下一页
S1 += 1
ITEAM1=shousuo(s1=s1,S1=S1) #将ITEAM1这个列表转换成下一页的信息。
if len(ITEAM1) == 0: #如果下一页列表为空
print('无下一页')
S1 -= 1
ITEAM1 =shousuo(s1=s1,S1=S1) #ITEAM1列表将重新获取原来网页信息
elif s2 == 's': #以下内容同上
S1 -= 1
ITEAM1=shousuo(s1=s1,S1=S1)
if len(ITEAM1) == 0:
print('无上一页')
S1 += 1
ITEAM1 =shousuo(s1=s1,S1=S1)
url2 = ITEAM1[int(s2)-1][0]
ITEAM2 = mulu(url2=url2)
翻页功能到此就可以实现了,但还有个小问题。一页只含有10个或10个以下的书名目录。如果输入11或超过页面数量的数字,程序就会挂。所以还要添加条件。
while 1:
print('请输入书名:')
s1 =input()
S1 = 0
ITEAM1 = shousuo(s1=s1, S1=S1)
if len(ITEAM1) == 0:
print('查无此书,请重新输入')
continue
print('请选择书:')
while 1: #这里不光选择书,也涉及到翻页。可能要多次用到以下模块。所以在此加个循环。
s2 = input()
if s2 == 'x': #如果输入‘x’ 下一页
S1 += 1
ITEAM1=shousuo(s1=s1,S1=S1) #将ITEAM1这个列表转换成下一页的信息。
if len(ITEAM1) == 0: #如果下一页列表为空
print('无下一页')
S1 -= 1
ITEAM1 =shousuo(s1=s1,S1=S1) #ITEAM1列表将重新获取原来网页信息
elif s2 == 's': #以下内容同上
S1 -= 1
ITEAM1=shousuo(s1=s1,S1=S1)
if len(ITEAM1) == 0:
print('无上一页')
S1 += 1
ITEAM1 =shousuo(s1=s1,S1=S1)
elif int(s2)<=len(shuliebiao): #判断输入的数字是否小于书名数量
url2 = ITEAM1[int(s2)-1][0] #获取小说的网址
ITEAM2 = mulu(url2=url2) #显示小说的目录并保存在ITEAM2列表里
以上,
小说搜索无结果以及小说搜索后的翻页的功能都已实现。
大概思路就是这样。程序有可能有bug,老早以前的程序,我又改了点内容。可能拼写或缩进有错误。见谅。
现在解决目录搜索问题。
就如我搜索结果如图:
最新章节为第一千六百六十一章,但我输入1661,出来的是第一千六百四十八章。
这就说明ITEAM2这个列表里有许多重章。要解决这个问题也很简单。
直接在ITEAM2内搜索章节名称。
将搜索后的内容放在一个新的列表ITEAM里
while 1:
s3 = input() #s3为章节选择
if s3.isdigit() : #如果输入是数字,则是章节选择。
if ITEAM != '': #如果进行过章节的搜索
url3 = ITEAM[int(s3) - 1][0] #将搜索后新列表内的网址传给url3
ITEAM2 = ITEAM #将搜索后的列表赋值给ITEAM2
else: #如果没进行章节搜索,则在原列表里选择
url3 = ITEAM2[int(s3)-1][0]
print(ITEAM2[int(s3) - 1][1])
xiaoshuo(url3=url3)
else: #如果输入的不是数字
ITEAM = []#建立一个新的空列表
for i in range(0, len(ITEAM2) - 1):#循环整个ITEAM2
if s3 in ITEAM2[i][1]: #找到与输入相符的内容
print(ITEAM2[i][1])#输出章节名称
ITEAM.append(ITEAM2[i])#添加进新列表
通过搜索功能,可以完成章节的准确查找。
例如搜索第一百一十 ,就将包含一百一十字样的章节输出:
如果想直接进入小说最新章节,不用进行搜索。直接设置‘z’为最新章节的输入。
只需添加以下程序
if s3 == 'z':
url3 = ITEAM[-1][0]
print(ITEAM2[-1][1])
xiaoshuo(url3=url3)
因为要先判断是否跳转进最新章节,所以要将
if s3.isdigit() : 改为 elif s3.isdigit() :
添加效果如图: