出现 "IndexError: list index out of range" 错误一般是因为你在使用列表时超出了其索引范围,也就是所访问的元素不存在。
在你的代码中,出现这个错误的可能原因是 soup.select() 方法没有找到符合要求的元素,导致返回的列表是空的,因此访问 [0] 索引时会超出列表的索引范围。
解决这个问题可以在使用列表前先检查其是否为空,例如可以使用 if len(soup.select(...)) > 0: 来检查是否有找到元素。
你可以尝试如下修改代码:import requests
from bs4 import BeautifulSoup
import os
path = os.getcwd()
passage = 0
print("请配合笔趣阁使用http://www.blkzfk.com")
name = input("请输入小说名:")
name = "\" + name + ".txt"
url = input("开始章节地址:")
endurl = input("结束章节地址:")
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.50'
while True:
r = requests.get(url, headers=head)
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, "html.parser")
# 检查是否找到标题和正文
title_list = soup.select("#wrapper > div.content_read > div > div.bookname > h1")
content_list = soup.select("#content.content")
if len(title_list) > 0 and len(content_list) > 0:
title = title_list[0].get_text()
content = content_list[0].get_text()
with open(path + name, 'a', encoding='utf-8') as f:
f.write(title + '\n')
f.write(content + '\n')
passage += 1
nexturl = "http://www.blkzfk.com/zfk" + soup.select("#wrapper > div.content_read > div > div.bookname > div.bottem1 > a:nth-child(1)")[0]['href']
print(f"已成功爬取第{passage}章")
if url == endurl:
break
url = nexturl
else:
print("没有找到标题或正文,无法爬取。")
os.system("pause")
注意,在这个示例中只是简单地添加了检查是否找到标题和正文的代码,你可能还需要根据实际情况做一些其他的处理。 |