鱼C论坛

 找回密码
 立即注册
查看: 2823|回复: 2

爬虫程序出现IndexError: list index out of range咋解决诶!

[复制链接]
发表于 2023-2-23 11:29:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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=soup.select("#wrapper > div.content_read > div > div.bookname > h1")[0].get_text()
    #正文部分
    text=soup.select("#content.content")[0].get_text()
    with open(path+name,'a',encoding='utf-8') as f:
        for i in title:
            f.write(i)
        f.write('\n')
        for x in text:
            f.write(x)
        f.write('\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
os.system("pause")

Traceback (most recent call last):
  File "C:\Users\10429\Desktop\novel-spider.py", line 18, in <module>
    title=soup.select("#wrapper > div.content_read > div > div.bookname > h1")[0].get_text()
IndexError: list index out of range
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-23 14:33:49 | 显示全部楼层
出现 "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")
注意,在这个示例中只是简单地添加了检查是否找到标题和正文的代码,你可能还需要根据实际情况做一些其他的处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-14 23:08:53 | 显示全部楼层
在这段代码中,出现了 "IndexError: list index out of range" 错误,这意味着您正在尝试访问不存在的索引。在这种情况下,可能是由于 BeautifulSoup 的选择器未能找到该元素导致的。可能是因为您的选择器没有正确匹配到所需的元素。

以下是一些可能的解决方案:

检查选择器:检查选择器是否正确匹配到所需的元素。在这段代码中,可能是选择器 "#wrapper > div.content_read > div > div.bookname > h1" 没有匹配到标题元素。

检查页面结构:检查页面是否发生了变化,可能是页面结构发生了变化导致选择器无法正确匹配元素。可以尝试手动查看网页源代码,确定选择器是否正确。

检查网络连接:检查网络连接是否正常,可能是网络连接不稳定导致请求失败。可以尝试使用浏览器访问同样的网页,查看是否能够正常访问。

检查代码逻辑:在循环中,可能是在最后一页没有下一页导致代码仍然继续运行,但是此时 soup.select() 方法无法找到需要的元素,导致出现了 "IndexError: list index out of range" 错误。可以添加一个判断条件,判断是否到达最后一页,如果是,则退出循环。

以下是一个修改后的代码示例,添加了一个判断条件:

while True:
    r=requests.get(url,headers=head)
    r.encoding=r.apparent_encoding
    soup=BeautifulSoup(r.text,"html.parser")
    # 判断是否到达最后一页
    if soup.select("#wrapper > div.content_read > div > div.bookname > h1") == []:
        break
    # 标题
    title=soup.select("#wrapper > div.content_read > div > div.bookname > h1")[0].get_text()
    # 正文部分
    text=soup.select("#content.content")[0].get_text()
    with open(path+name,'a',encoding='utf-8') as f:
        for i in title:
            f.write(i)
        f.write('\n')
        for x in text:
            f.write(x)
        f.write('\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
希望这些解决方案能够帮助您解决问题。如果问题仍然存在,请尝试在异常抛出时输出变量的值,以便更好地定位问题的根本原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 02:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表