You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:54:20