You need to enable JavaScript to run this app. 使用BeautifulSoup爬取橄榄球球员数据时提取a标签姓名报错求助
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 06:36:01