Python报list index out of range错误,如何检查d的长度及d[index]是否可用?
索引越界原因
你代码中硬编码访问了d[0]到d[23]共24个下标,但BeautifulSoup的find_all返回的子节点列表长度由实际网页结构决定,部分player-data-personal-info节点的直接子节点数量不足24,访问不存在的下标就会触发报错。
解决方法
1. 加长度校验过滤异常节点
如果确认符合要求的节点必须有24个直接子节点,可以在列表推导式中增加长度判断,直接过滤掉子节点数量不足的异常节点:
soup = BeautifulSoup(r.content, "html.parser") det = soup.find_all('div', class_= 'player-data-personal-info') PlayerDetailsResult.extend([ { d[0].text.strip(): d[1].text.strip(), d[2].text.strip(): d[3].text.strip(), d[4].text.strip(): d[5].text.strip(), d[6].text.strip(): d[7].text.strip(), d[8].text.strip(): d[9].text.strip(), d[10].text.strip(): d[11].text.strip(), d[12].text.strip(): d[13].text.strip(), d[14].text.strip(): d[15].text.strip(), d[16].text.strip(): d[17].text.strip(), d[18].text.strip(): d[19].text.strip(), d[20].text.strip(): d[21].text.strip(), d[22].text.strip(): d[23].text.strip(), } # 增加长度判断,只有子节点数量>=24才处理 for d in (d.find_all(recursive=False) for d in det) if len(d) >=24 ]) j = j+1
2. 动态遍历避免硬编码下标(更推荐)
如果子节点是固定的键值交替结构,直接用步长为2的遍历逻辑自动生成字典,不需要硬编码下标,适配子节点数量不固定的场景:
soup = BeautifulSoup(r.content, "html.parser") det = soup.find_all('div', class_= 'player-data-personal-info') PlayerDetailsResult.extend([ # 成对遍历子节点,自动生成键值对 {d[i].text.strip(): d[i+1].text.strip() for i in range(0, len(d), 2)} for d in (d.find_all(recursive=False) for d in det) # 可选:加校验过滤子节点数量为奇数的异常情况 if len(d) %2 ==0 ]) j = j+1
3. 单个下标可用性判断方法
如果需要单独校验某个下标是否可以访问,只需要判断列表长度是否大于目标下标即可:
target_index = 5 if len(d) > target_index: # 下标可用,执行对应操作 val = d[target_index].text.strip()
内容的提问来源于stack exchange,提问作者Mehdi Arfaei
相关产品推荐
相关产品推荐

