使用BeautifulSoup爬取OddsChecker出现索引错误的问题咨询
错误原因排查与解决方案
list index out of range错误触发的直接原因是page_soup.select()返回的列表元素数量小于2,你尝试访问索引为1的第二个元素时超出了列表下标范围,具体诱因可以从以下几个方向排查:
可能的诱因
- 反爬机制拦截
若请求被目标网站的反爬策略拦截,返回的内容会是验证码页面、403拒绝访问页面等非目标赛事页面,页面内不存在包含Both Teams To Score文本的h2标签,select()会返回空列表,直接取[1]就会触发索引错误。 - 页面结构更新
目标网站可能调整了前端页面结构:- 包含
Both Teams To Score文本的标签不再是h2标签,或文本内容发生了空格、大小写、表述调整,导致没有匹配到任何元素 - 匹配到的符合条件的h2标签数量不足2个,比如当前仅存在1个符合条件的标签,访问索引1自然越界
- 包含
- 解析器适配问题
内置的html.parser对部分不规范的HTML结构解析效果不佳,可能会出现元素漏识别的情况。
修复方案
- 先验证请求是否正常
增加状态码和返回内容校验,确认你拿到的是正常的目标页面:
若状态码非200或返回内容不存在目标文本,说明被反爬拦截,可更换更新的User-Agent、补充Referer、Cookie等请求头字段,或使用代理IP解决。# 打印请求状态码,正常应为200 print(req.status_code) # 确认返回内容包含目标文本 print("Both Teams To Score" in req.text) - 避免硬编码索引
先校验匹配到的元素数量再取值,不要直接固定写死索引:match_h2_list = page_soup.select('h2:-soup-contains("Both Teams To Score")') print(f"匹配到的h2标签数量:{len(match_h2_list)}") if len(match_h2_list) >= 2: market_id = match_h2_list[1]["aria-controls"] else: # 自行处理异常场景,比如输出页面内容排查结构变化 print("匹配元素不足,无法获取market_id") - 优化元素定位方式
文本匹配的定位方式稳定性极低,建议优先通过标签的class、id、父容器的固定属性等更稳定的特征定位元素,也可更换lxml作为解析器提升识别准确率:page_soup = BeautifulSoup(req.content, "lxml")
内容的提问来源于stack exchange,提问作者order66
相关产品推荐
相关产品推荐

