我正在运行的代码(直接来自sportsipy文档(:
from sportsipy.nba.teams import Teams
teams = Teams()
for team in teams:
print(team.name, team.abbreviation)
返回以下内容:
请求的页面返回了有效的响应,但找不到任何数据。赛季开始了吗?www.sports-reference.com上有数据吗?
有没有人对从API获取这些信息有什么建议?
那个包api已经过时了。它试图解析的表现在有一个不同的id属性。
你能做的几件事:
- 进入并手动编辑/修补代码以获得正确的数据
- 在github上提出问题并等待修复和更新
就个人而言,修补程序/修复程序是一个快速简单的程序,所以只需这样做(但可能还有其他表需要查找(。
打开nba_utils.py
:
第85行和第86行:
发件人:
teams_list = utils._get_stats_table(doc, 'div#all_team-stats-base')
opp_teams_list = utils._get_stats_table(doc, 'div#all_opponent-stats-base')
收件人:
teams_list = utils._get_stats_table(doc, '#totals-team')
opp_teams_list = utils._get_stats_table(doc, '#totals-opponent')
这将解决当前的错误,但是,我不知道还有哪些类和函数可能需要修补。有一个机会,因为这张桌子发生了轻微的变化,其他的可能也发生了变化。
输出:
Charlotte Hornets CHO
Milwaukee Bucks MIL
Utah Jazz UTA
Sacramento Kings SAC
Memphis Grizzlies MEM
Los Angeles Lakers LAL
Miami Heat MIA
Indiana Pacers IND
Houston Rockets HOU
Phoenix Suns PHO
Atlanta Hawks ATL
Minnesota Timberwolves MIN
San Antonio Spurs SAS
Boston Celtics BOS
Cleveland Cavaliers CLE
Golden State Warriors GSW
Washington Wizards WAS
Portland Trail Blazers POR
Los Angeles Clippers LAC
New Orleans Pelicans NOP
Dallas Mavericks DAL
Brooklyn Nets BRK
New York Knicks NYK
Orlando Magic ORL
Philadelphia 76ers PHI
Chicago Bulls CHI
Denver Nuggets DEN
Toronto Raptors TOR
Oklahoma City Thunder OKC
Detroit Pistons DET
另一种选择是不使用api,自己获取数据。如果你不需要缩写,可以直接使用pandas:
import pandas as pd
url = 'https://www.basketball-reference.com/leagues/NBA_2022.html'
teams = list(pd.read_html(url)[4].dropna(subset=['Rk'])['Team'])
for team in teams:
print(team)
如果你确实需要缩写,那么这就有点棘手了,但可以使用BeautifulSoup将其从团队中提取出来href:
import requests
from bs4 import BeautifulSoup
url = 'https://www.basketball-reference.com/leagues/NBA_2022.html'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'id':'per_game-team'})
rows = table.find_all('td', {'data-stat':'team'})
teams = {}
for row in rows:
if row.find('a'):
name = row.find('a').text
abbreviation = row.find('a')['href'].split('/')[-2]
teams.update({name:abbreviation})
for team in teams.items():
print(team[0], team[1])