Python+BeautifulSoup爬虫输出空列表空字典问题排查
问题根源
代码爬取结果为空有3个核心原因:
- DOM选择范围过大:页面中导航、页脚、布局模块大量使用
div.row类名,这些节点下不存在赛事对应的col-md-4列,遍历后会生成大量空字典 - 静态请求拿不到有效数据:赛事列表不是写在初始HTML里的,是页面加载完成后通过JS异步拉取数据渲染的,直接用requests请求初始页面只能拿到无赛事内容的静态骨架
- 硬编码索引容错性差:字段映射完全按固定索引匹配,只要节点内文本节点数量和预设值不一致,要么匹配错位要么触发键错误,无法正常写入数据
修复方案
直接请求赛事数据的异步接口,缩小DOM匹配范围,增加空值过滤逻辑,修复后代码如下:
import requests from bs4 import BeautifulSoup import json field_map = { 0: "title", 1: "dates", 2: "city/state", 3: "country", 4: "event", 5: "reps", 6: "prize", 7: "results" } url = "https://mms.kcbs.us/members/evr_search_results.php?org_id=KCBA" # 补充请求头模拟浏览器访问,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", "Referer": "https://mms.kcbs.us/members/evr_search.php?org_id=KCBA" } response = requests.get(url, headers=headers).text soup = BeautifulSoup(response, features='lxml') all_data = [] # 只匹配赛事容器下的row节点,过滤布局用的无关row for event_row in soup.select('div.container > div.row'): cols = event_row.find_all('div', class_='col-md-4') if not cols: continue event = {} field_idx = 0 for col in cols: # 过滤空文本、换行符等无效内容 text_items = [t.strip() for t in col.stripped_strings if t.strip()] for item in text_items: if field_idx >= len(field_map): break event[field_map[field_idx]] = item field_idx += 1 # 只存入有效赛事数据,跳过空字典 if event: all_data.append(event) print(json.dumps(all_data, indent=4, ensure_ascii=False))
关键调整说明
- 绕过前端JS渲染逻辑,直接请求后端返回赛事列表的接口,从根源拿到完整赛事数据
- 补充浏览器请求头,避免被站点反爬策略拦截返回空内容
- 收窄DOM选择器范围,只遍历赛事列表区域的row节点,跳过无关布局节点
- 增加空值、空节点判断逻辑,不会生成无效空字典
- 优化字段匹配逻辑,自动过滤空白字符,不会因为文本节点数量偏差导致匹配失败
内容的提问来源于stack exchange,提问作者user19341179
相关产品推荐
相关产品推荐

