Python/BeautifulSoup爬取仅返回表格首个数据项问题排查
问题分析与解决
你的代码只获取到第一行数据的核心原因:
- 你用
find_all("div",{"class":"mobile-table double-header"})拿到的是整个表格的外层容器,该页面里仅有1个这样的div,所以循环只会执行1次。 - 在这个容器内调用
find("a",{"class","player-name"})只会返回容器里的第一个球员链接,自然只能拿到第一行数据。
修正后的代码
import requests from bs4 import BeautifulSoup import pandas r = requests.get("https://www.fantasypros.com/nfl/stats/qb.php") c = r.content soup = BeautifulSoup(c, "html.parser") # 定位表格主体,获取所有数据行 all_rows = soup.find("table", {"id": "data"}).find("tbody").find_all("tr") l = [] for row in all_rows: d = {} # 在当前行内查找球员名称标签 player_elem = row.find("a", {"class": "player-name"}) # 避免找不到元素引发报错 if player_elem: d["Player"] = player_elem.text.strip() l.append(d) df = pandas.DataFrame(l) df.to_csv("Output.csv", index=False)
关键修正点
- 把循环对象从表格容器改为表格的每一行(tr元素),确保遍历所有数据行。
- 增加空值判断,防止页面结构变化导致代码报错。
- 导出CSV时添加
index=False,移除默认索引列,让输出更整洁。
内容的提问来源于stack exchange,提问作者pynewbpy44
相关产品推荐
相关产品推荐

