使用Python爬取fbref.com时遇列表越界及NoneType迭代错误求助
针对fbref爬虫的列表索引越界与NoneType迭代错误排查及修复建议
列表索引越界问题
- 核心原因:你通过索引(比如
list[0])访问列表元素,但列表为空,说明页面元素抓取失败——可能是fbref页面结构更新、请求被反爬拦截返回非目标内容,或者选择器失效。 - 修复方案:
- 先打印调试:在取索引前,输出目标列表的内容和长度,比如
print(len(player_data_rows), player_data_rows),确认是否真的抓到了元素。 - 增加判断逻辑:避免直接硬索引,改成:
if len(target_list) > 0: target_item = target_list[0] else: print("未抓取到目标元素,跳过") continue - 核对选择器:打开fbref目标页面,用浏览器开发者工具重新定位元素,确认CSS/XPath选择器是否匹配最新的页面结构(比如表格类名、容器ID是否变更)。
- 先打印调试:在取索引前,输出目标列表的内容和长度,比如
'NoneType'对象不可迭代问题
- 核心原因:你尝试遍历一个
None值,说明调用find()/select_one()等方法时未找到目标元素,返回了None,后续却直接用for循环遍历它。 - 修复方案:
- 前置非空判断:所有可能返回
None的元素调用,先检查再操作:target_container = soup.find('div', class_='stats-container') if target_container: for row in target_container.find_all('tr'): # 处理每行数据 pass else: print("未找到数据容器,跳过") - 处理动态加载内容:fbref部分数据是通过JS动态渲染的,用
requests直接请求HTML可能拿不到完整数据,这时可以用selenium/playwright模拟浏览器加载页面,或者抓页面的XHR接口直接请求JSON数据。 - 反爬适配:fbref会拦截高频请求,给请求加合法的
User-Agent、Referer头,每次请求后加1-3秒的随机延迟,避免被封IP导致返回空内容。
- 前置非空判断:所有可能返回
通用调试技巧
- 增加异常捕获:在关键代码块外包裹try-except,精准定位错误位置:
try: # 抓取并处理数据的代码段 player_name = player_rows[0].text.strip() except IndexError as e: print(f"索引错误:{e},当前页面未找到球员数据") except TypeError as e: print(f"迭代错误:{e},数据容器为空") - 记录运行日志:用Python的
logging模块记录每个请求的URL、响应状态码、抓取到的元素数量,方便回溯问题。
内容的提问来源于stack exchange,提问作者Ruben Fernandez
相关产品推荐
相关产品推荐

