You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页抓取数据转文本报错:Python提取足球球员数据存Excel遇AttributeError

问题

我想用Python抓取网站上的足球球员数据并导出到Excel文件。目前代码能提取信息,但拿到的是HTML代码而非文本;尝试用.text属性转换时,出现错误:

AttributeError: 'NoneType' object has no attribute 'text'

目标是把球员姓名、俱乐部、出场时长等信息存入Excel,现有代码如下:

from bs4 import BeautifulSoup
import requests
import pandas as pd

def get_data(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")

    players = soup.find("table", 
                class_="module-statistics statistics")
    
    data=[]
    
    for player in players:
        item={}
    
        item["Name"] = player.find("td", 
                    class_="person-name").text
        item["Verein"] = player.find("td", 
                    class_="team-name")
    
        item["Minuten"] = player.find("td", 
                    class_="person_stats-playing_minutes person_stats-playing_minutes-list")
    
        item["Ballkontakte pro Minute"] = player.find("td", 
                    class_="person_stats-balls_touched_per_minute")
    
        item["Summe Ballkontakte"] = player.find("td", 
                    class_="person_stats-balls_touched person_stats-balls_touched-list")
                                    
        
        data.append(item)
    
    return data

def export_data(data):
    df = pd.DataFrame(data)
    df.to_excel("Spieler.xlsx")

if __name__ == "__main__":
    data = get_data("https://sportdaten.spiegel.de/fussball/bundesliga/ma9417803/fc-augsburg_eintracht-frankfurt/spielstatistik-ballkontakte/")
export_data(data)
    print("done")

解决方案

核心问题修正点

  • 直接遍历table对象会拿到thead、tbody这类节点,不是球员数据行,得先定位到表格里的tr行元素
  • 调用.text前必须判断元素是否存在,避免NoneType错误
  • 所有字段都要提取文本内容,不能存HTML元素对象

修改后的完整代码

from bs4 import BeautifulSoup
import requests
import pandas as pd

def get_data(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text,"lxml")

    # 先找到表格,再定位到tbody里的所有球员行
    table = soup.find("table", class_="module-statistics statistics")
    if not table:
        return []
    player_rows = table.find("tbody").find_all("tr")
    
    data=[]
    
    for row in player_rows:
        item={}
        # 提取姓名:先判断元素存在再取text,不存在则设为None
        name_elem = row.find("td", class_="person-name")
        item["Name"] = name_elem.text.strip() if name_elem else None
        
        # 提取俱乐部
        verein_elem = row.find("td", class_="team-name")
        item["Verein"] = verein_elem.text.strip() if verein_elem else None
        
        # 提取出场时长
        minuten_elem = row.find("td", class_="person_stats-playing_minutes person_stats-playing_minutes-list")
        item["Minuten"] = minuten_elem.text.strip() if minuten_elem else None
        
        # 提取每分钟触球数
        bkpmin_elem = row.find("td", class_="person_stats-balls_touched_per_minute")
        item["Ballkontakte pro Minute"] = bkpmin_elem.text.strip() if bkpmin_elem else None
        
        # 提取总触球数
        sum_bk_elem = row.find("td", class_="person_stats-balls_touched person_stats-balls_touched-list")
        item["Summe Ballkontakte"] = sum_bk_elem.text.strip() if sum_bk_elem else None
                                    
        data.append(item)
    
    return data

def export_data(data):
    df = pd.DataFrame(data)
    df.to_excel("Spieler.xlsx", index=False)  # 去掉默认索引列

if __name__ == "__main__":
    data = get_data("https://sportdaten.spiegel.de/fussball/bundesliga/ma9417803/fc-augsburg_eintracht-frankfurt/spielstatistik-ballkontakte/")
    export_data(data)
    print("done")

额外说明

  • 加入了strip()方法去除文本前后的空格和换行,让数据更整洁
  • 导出Excel时添加index=False,避免生成多余的索引列
  • 增加了表格不存在时的判断,防止后续代码报错

内容的提问来源于stack exchange,提问作者Dominik Kacinski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:08:11