如何用BeautifulSoup筛选数据?解决NFL赛程爬取列数不一致问题
解决NFL赛程爬取的字段缺失与赛事筛选问题
问题分析
你爬取ESPN NFL赛程时遇到的核心问题:未开赛赛事带有「time」列,赛事开始后网站会移除该列,导致爬取的每行字段数量不一致,无法正常构造DataFrame;同时需要筛选出仅未开赛的赛事,避免混入已开赛/结束的条目。
解决方案思路
ESPN的赛程表格中,未开赛的赛事行包含date__col类的时间元素,而已开赛/结束的赛事会将该列替换为比分等内容。因此可以通过BeautifulSoup判断每行是否存在date__col元素,筛选出未开赛赛事;同时按单场赛事为单位爬取字段,确保每条数据的字段数一致。
修改后的代码实现
import requests from bs4 import BeautifulSoup import pandas as pd link = "https://www.espn.com/nfl/schedule/_/week/1/year/2022/seasontype/3" page = requests.get(link) soup = BeautifulSoup(page.content, "html.parser") # 定位所有赛程表格 nfl_tables = soup.find_all('div', class_='ResponsiveTable') # 存储未开赛赛事数据 upcoming_games = [] for table in nfl_tables: # 遍历表格内的每一行赛事 game_rows = table.find_all('tr', class_='Table__TR') for row in game_rows: # 判断是否为未开赛赛事(存在时间列则为未开赛) time_col = row.find('td', class_='date__col Table__TD') if not time_col: # 无时间列,说明赛事已开始/结束,直接跳过 continue # 提取单场赛事的各项信息 game_time = time_col.text.strip() # 提取客队、主队信息 team_cols = row.find_all('td', class_='events__col Table__TD') visitor_team = team_cols[0].text.strip() if team_cols else "" home_team = team_cols[1].text.strip() if len(team_cols)>=2 else "" # 提取场地信息 location_col = row.find('td', class_='location__col Table__TD') game_location = location_col.text.strip() if location_col else "" # 将单场数据存入列表 upcoming_games.append({ "时间": game_time, "客队": visitor_team, "主队": home_team, "场地": game_location }) # 构造结构一致的DataFrame df = pd.DataFrame(upcoming_games) print(df)
代码说明
- 按单场赛事行为单位遍历,先判断是否存在时间列,直接跳过已开赛赛事,从根源避免字段缺失问题
- 每个字段提取都做了边界判断,避免索引越界报错
- 最终生成的DataFrame仅包含未开赛赛事,所有条目字段数完全一致,不会出现构造失败的情况
内容的提问来源于stack exchange,提问作者DrFox
相关产品推荐
相关产品推荐

