如何修正Python代码以爬取ESPN网站第5周所有NFL赛事盘口数据至Pandas DataFrame
解决ESPN NFL盘口数据爬取仅返回单场的问题
嘿,我看你遇到了只爬取到第一场NFL赛事盘口数据的问题,这就来帮你搞定它!
问题根源
你的原代码里用了soup.find('section', {'class':"Card"}),这个方法只会抓取页面中第一个带有Card类的区块。但ESPN的NFL盘口页面里,每一组赛事的数据都被放在独立的Card区块里,所以只取第一个当然只能拿到第一场的数据。
修复后的完整代码
import pandas as pd # 数据分析库 import requests # 请求处理库 from bs4 import BeautifulSoup # HTML解析库 # 获取页面HTML响应 url = "https://www.espn.com/nfl/lines" response = requests.get(url) # 解析HTML内容 soup = BeautifulSoup(response.text, 'html.parser') # 找到页面中所有包含赛事数据的Card区块 all_game_cards = soup.find_all('section', {'class': "Card"}) # 初始化列表存储每个赛事区块的DataFrame game_data_frames = [] # 遍历每个Card区块,提取表格数据 for card in all_game_cards: # 从当前Card中读取HTML表格 table_data = pd.read_html(str(card)) # 只保留包含有效赛事数据的表格(过滤掉无数据的Card) if table_data: game_data_frames.append(table_data[0]) # 合并所有赛事数据为一个完整的DataFrame final_nfl_lines_df = pd.concat(game_data_frames, ignore_index=True) # 打印结果(可以用head()先看前几行,或者直接打印全部) print(final_nfl_lines_df.head(10))
关键修改点说明
- 用
find_all替代find:一次性获取页面中所有的Card区块,而不是仅第一个 - 遍历+过滤:逐个处理每个Card,只保留包含有效表格数据的部分(避免页面中其他非赛事Card干扰)
- 合并DataFrame:用
pd.concat把所有小的赛事表格合并成一个完整的DataFrame,这样就能拿到第5周所有赛事的盘口数据了
运行这段代码后,你就能得到包含所有NFL第5周赛事的盘口数据的DataFrame啦。
内容的提问来源于stack exchange,提问作者Pmannn
相关产品推荐
相关产品推荐

