使用BeautifulSoup爬取橄榄球球员数据时提取a标签姓名报错求助
核心报错原因定位
你之前尝试给find_all()结果加.text触发报错,本质是find_all()返回的是所有匹配项组成的列表,列表本身不存在.text属性,自然无法调用。
具体修正方案
方案1:基于现有BeautifulSoup逻辑改造
- 把原本取td的
find_all()换成find():因为每行tr中对应球员的data-stat="player"的td仅存在1个,用find()可以直接拿到单个td标签对象,而非列表。 - 提取文本时可以直接定位td内部嵌套的
<a>标签取内容,从根源上避开td文本末尾附带的*、首尾多余空格等冗余内容。 - 增加空值判断跳过表头、汇总类的空行,避免触发
NoneType对象的属性调用报错。
改造后的循环部分代码:
for row in rows: # 直接匹配单行内唯一的球员td,而非返回列表 player_td = row.find('td', {'data-stat':'player'}) # 跳过无匹配内容的行 if not player_td: continue # 取td内部a标签的文本,自动去除首尾空白 player_name = player_td.find('a').get_text(strip=True) players.append(player_name) print(player_name)
方案2:更简便的高效实现
不需要逐行手写循环解析表格,pandas自带的read_html可以直接解析页面中的表格结构,省去手动定位标签、逐行遍历的步骤,几行代码就能拿到结构化数据:
import pandas as pd # 匹配页面对应的冲刺数据表,指定正确的表头行位置 df = pd.read_html(url, match='Rushing & Receiving', header=1)[0] # 提取球员列,批量清洗文本中附带的标记符号、多余空格 players = df['Player'].str.replace(r'[\*\+]', '', regex=True).str.strip().tolist()
最终输出效果
运行修正后的代码,即可得到你预期的纯文本球员名列表:
Derrick Henry Dalvin Cook Josh Jacobs
小提示:如果直接取td的纯文本而非a标签内容,拿到的字符串会附带末尾的球员身份标记(比如
*代表入选职业碗),可以通过replace('*', '').strip()做二次清洗即可。
内容的提问来源于stack exchange,提问作者Preston G
相关产品推荐
相关产品推荐

