在使用Python爬虫采集数据的过程中,list out of range是出现频率很高的运行时错误,本质是访问列表时使用的索引值超过了列表本身的长度范围,导致程序无法找到对应位置的元素而抛出异常。这类错误大多出现在数据解析阶段,和爬取到的页面内容、解析逻辑直接相关。

常见触发场景
1. 页面结构发生变化
很多网站的页面结构会不定期调整,比如原本目标数据在页面中排在第3个位置,对应的索引是2,但是页面改版后目标数据位置前移或者后移,甚至被移除,此时按照原来的索引取值就会出现越界问题。比如用BeautifulSoup解析页面时,原本预期能拿到3个标签,实际只拿到1个,访问索引2的位置就会报错。
from bs4 import BeautifulSoup
html = "<div><a>链接1</a></div>" # 实际只有1个a标签
soup = BeautifulSoup(html, "html.parser")
a_list = soup.find_all("a")
# 原本预期有3个a标签,访问索引2就会触发list out of range
print(a_list[2])2. 爬取返回空数据或异常页面
如果爬虫请求时遇到反爬拦截、网络波动,或者目标页面不存在,返回的内容可能是空页面、错误提示页,此时解析得到的列表可能为空,或者长度远小于预期。比如请求一个需要登录的页面,未携带登录态返回的是登录页,原本要提取的列表元素不存在,访问对应索引就会报错。
import requests
url = "https://ipipp.com/test"
# 未携带headers可能被反爬,返回空内容
response = requests.get(url)
html = response.text
# 解析后得到的列表可能为空
data_list = html.split("目标标识")
# 列表为空时访问索引0就会触发错误
print(data_list[0])3. 解析逻辑和实际内容不匹配
编写解析逻辑时没有考虑边界情况,比如默认列表长度一定大于等于某个值,没有做前置判断。比如用正则表达式提取数据时,正则匹配的结果可能为空,或者匹配到的数量少于预期,直接取固定索引就会越界。
import re html = "这是一段没有目标内容的文本" # 正则未匹配到内容,结果列表为空 match_list = re.findall(r"目标内容(\d+)", html) # 直接取第一个元素就会报错 target = match_list[0]
排查与解决方法
- 先打印列表的长度和内容,确认实际爬取到的数据是否符合预期,比如解析后先输出
len(a_list)和a_list查看具体情况。 - 访问列表元素前先做长度判断,确保索引小于列表长度再取值,避免越界。
- 对请求结果做校验,判断返回的状态码是否为200,页面内容是否包含预期的关键标识,排除空页面、异常页面的影响。
- 如果目标页面结构经常变化,可以改用更灵活的解析方式,或者增加容错逻辑,比如用try-except捕获索引越界异常,避免程序直接中断。
以下是增加容错逻辑的示例代码,可以有效避免list out of range错误导致程序崩溃:
from bs4 import BeautifulSoup
def safe_get_data(html, index=0):
soup = BeautifulSoup(html, "html.parser")
target_list = soup.find_all("div", class_="target-class")
# 先判断列表长度是否足够
if len(target_list) > index:
return target_list[index].text
else:
# 长度不足时返回默认值或者空字符串
return ""
# 测试不同场景
normal_html = "<div class='target-class'>内容1</div><div class='target-class'>内容2</div>"
empty_html = "<div>没有目标内容</div>"
print(safe_get_data(normal_html, 1)) # 正常返回内容2
print(safe_get_data(empty_html, 0)) # 返回空字符串,不会报错总结
Python爬虫中的list out of range错误核心是列表索引访问越界,大多和页面结构变化、数据返回异常、解析逻辑不完善有关。只要在解析前做好数据校验,访问索引前做长度判断,增加必要的容错逻辑,就能大幅减少这类错误的出现,提升爬虫程序的稳定性。
Python爬虫list_out_of_range数据解析索引越界异常处理修改时间:2026-06-02 22:37:29