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

无法获取NBA球队数据页面完整HTML,提取表格失败求助

解决NBA Stats团队传统数据表格提取问题

Hey Roberto, 你遇到的问题其实是典型的动态网页数据抓取坑——这个NBA Stats页面用了前端框架(AngularJS)来动态渲染内容,咱们一步步拆解原因和解决方案:

为什么之前的方法都不管用?

你用requests.get()拿到的只是页面的初始骨架HTML,里面的<nba-stat-table>只是个占位标签,真实的表格数据是页面加载完成后,通过JavaScript从后端API拉取并渲染出来的。所以你保存到html.txt里的内容才会只有空的标签,没有实际表格。

  • 第一种pandas方案:read_html只会找HTML里现成的<table>标签,而初始HTML里根本没有,自然触发No tables found错误。
  • 第二种BeautifulSoup方案:你定位到的<nba-stat-table>在初始HTML里是空的,还没被JS填充内容,所以遍历descendants啥也输出不了。

解决方案1:用Selenium模拟浏览器加载(适合不想折腾API的情况)

Selenium可以模拟真实浏览器打开页面,等JavaScript把表格渲染好再拿完整HTML,这样就能正常解析表格了。

步骤:

  1. 先装Selenium和对应浏览器的驱动(比如ChromeDriver,要和你的Chrome版本匹配)
  2. 运行下面的代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

# 初始化Chrome驱动(确保ChromeDriver路径正确,或者配置到系统PATH里)
driver = webdriver.Chrome()
url = "https://stats.nba.com/teams/traditional/?sort=GP&dir=-1"

driver.get(url)

# 等10秒,直到表格加载出来(这里等nba-stat-table下的table元素出现)
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "nba-stat-table table")))

# 拿到渲染后的完整页面HTML
html = driver.page_source

# 用pandas解析表格,取最后一个表格(对应页面的团队数据)
df_list = pd.read_html(html)
df = df_list[-1]

# 看看结果
print(df.head())

# 记得关闭浏览器
driver.quit()

解决方案2:直接调用NBA的API(更高效,强烈推荐)

其实NBA Stats的所有数据都是通过公开API返回的,直接请求API拿JSON数据,比模拟浏览器快多了,还不用等渲染。

我帮你找到了对应页面的API接口(可以通过浏览器开发者工具的Network标签抓包找到),代码示例如下:

import requests
import pandas as pd

# 设置请求头,模拟浏览器请求,避免被NBA的服务器拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Referer": "https://stats.nba.com/"
}

# API地址,注意Season参数要对应当前赛季(比如2024-25是当前常规赛赛季)
api_url = "https://stats.nba.com/stats/leaguedashteamstats?Conference=&DateFrom=&DateTo=&Division=&GameScope=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperience=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2024-25&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&TwoWay=0&VsConference=&VsDivision="

# 发送请求拿到JSON数据
response = requests.get(api_url, headers=headers)
data = response.json()

# 提取表头和数据行
columns = [col['name'] for col in data['resultSets'][0]['headers']]
rows = data['resultSets'][0]['rowSet']

# 转换成DataFrame,再按GP(出场数)降序排序,和原页面一致
df = pd.DataFrame(rows, columns=columns)
df_sorted = df.sort_values(by='GP', ascending=False)

# 查看结果
print(df_sorted.head())

这样就能轻松拿到你想要的团队数据表格啦!


内容的提问来源于stack exchange,提问作者Roberto Corral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:32