网页抓取数据转文本报错: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
相关产品推荐
相关产品推荐

