#python #beautifulsoup
#Python #BeautifulSoup
Вопрос:
Я впервые использую beautiful soup для очистки веб-страниц, и я хотел сделать небольшой проект с хоккеем, так как я большой поклонник этого вида спорта. Я немного застрял и задаюсь вопросом, как получить названия заголовков статистики для каждого игрока.
Вот мой текущий код:
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd
url = "http://www.espn.com/nhl/statistics/player/_/stat/points/year/2020/seasontype/2"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
allStats = []
players = soup.find_all('tr', attrs={'class':re.compile('row player')})
for player in players:
stats = [stat.get_text() for stat in player.find_all('td')]
allStats = stats
body = soup.find_all('div', {"class":"wrapper"})
print(allStats)
allColumns = []
headers = soup.find_all('tr', attrs = {'class': 'colhead'})
for col in headers:
columns = [col.get_text() for col in headers.find_all('td')]
allColumns = columns
print(allColumns)
В настоящее время я получаю сообщение об ошибке, в котором говорится: «Объект набора результатов не имеет атрибута ‘%s’ для строки
headers = soup.find_all('tr', attrs = {'class': 'colhead'})
В конце концов, я хочу получить список всех отслеживаемых имен характеристик и использовать его в качестве столбцов в фрейме данных pandas, в котором перечислены каждый игрок и их соответствующая статистика.
Каков наилучший способ добиться этого?
Спасибо за вашу помощь!
Комментарии:
1. Если таблица статична, вы пробовали pd.read_html(url), чтобы получить список таблиц со страницы с pandas в качестве pd?
Ответ №1:
В вашей headers
итерации есть опечатка, поэтому вы получаете ошибку,
AttributeError: ResultSet object has no attribute 'find_all'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?
Я полагаю, ожидаемый результат выглядит следующим образом.
allColumns = []
headers = soup.find_all('tr', attrs = {'class': 'colhead'})
for header in headers:
columns = [head.get_text() for head in header.find_all('td')]
allColumns = columns
>>>
['', 'PP', 'SH', 'RK', 'PLAYER', 'TEAM', 'GP', 'G', 'A', 'PTS', ' /-', 'PIM', 'PTS/G', 'SOG', 'PCT', 'GWG', 'G', 'A', 'G', 'A', '', 'PP', 'SH', 'RK', 'PLAYER', 'TEAM', 'GP', 'G', 'A', 'PTS', ' /-', 'PIM', 'PTS/G', 'SOG', 'PCT', 'GWG', 'G', 'A', 'G', 'A', '', 'PP', 'SH', 'RK', 'PLAYER', 'TEAM', 'GP', 'G', 'A', 'PTS', ' /-', 'PIM', 'PTS/G', 'SOG', 'PCT', 'GWG', 'G', 'A', 'G', 'A', '', 'PP', 'SH', 'RK', 'PLAYER', 'TEAM', 'GP', 'G', 'A', 'PTS', ' /-', 'PIM', 'PTS/G', 'SOG', 'PCT', 'GWG', 'G', 'A', 'G', 'A']
Ответ №2:
В качестве альтернативы существует espn api для получения статистики. Но не задокументировано, как использовать конкретный сезон или тип сезона:
http://site.api.espn.com/apis/site/v2/sports/football/nfl/statistics
Тем не менее, вы можете извлечь статистику игрока из nhl.com сайт с их api:
import requests
import pandas as pd
url = 'https://statsapi.web.nhl.com/api/v1/teams'
jsonDataTeams = requests.get(url).json()
teamsDict = {}
for team in jsonDataTeams['teams']:
rosterLink = 'https://statsapi.web.nhl.com' team['link'] '/roster'
teamsDict.update({team['name']:rosterLink})
playersDict = {}
for team, link in teamsDict.items():
jsonDataPlayers = requests.get(link).json()
for player in jsonDataPlayers['roster']:
playerLink = 'https://statsapi.web.nhl.com' player['person']['link'] '/stats'
playersDict.update({player['person']['fullName']:playerLink})
print ('Downloaded: %s' %team)
rows = []
count = 0
tot = len(playersDict)
for player, link in playersDict.items():
count =1
payload = {'stats':'statsSingleSeason',
'season':'20192020'}
playerStats = requests.get(link, params=payload).json()
try:
row = playerStats['stats'][0]['splits'][0]['stat']
row.update({'player':player})
rows.append(row)
print ('%s of %s - Stats collected for: %s' %(count,tot,player))
except:
print ('%s of %s - No stats available for: %s' %(count,tot,player))
df = pd.DataFrame(rows)
Вывод:
print(df.head(20).to_string())
timeOnIce ot shutouts ties wins losses saves powerPlaySaves shortHandedSaves evenSaves shortHandedShots evenShots powerPlayShots savePercentage goalAgainstAverage games gamesStarted shotsAgainst goalsAgainst timeOnIcePerGame powerPlaySavePercentage shortHandedSavePercentage evenStrengthSavePercentage player assists goals pim shots hits powerPlayGoals powerPlayPoints powerPlayTimeOnIce evenTimeOnIce penaltyMinutes faceOffPct shotPct gameWinningGoals overTimeGoals shortHandedGoals shortHandedPoints shortHandedTimeOnIce blocked plusMinus points shifts evenTimeOnIcePerGame shortHandedTimeOnIcePerGame powerPlayTimeOnIcePerGame
0 2340:03 3.0 1.0 0.0 16.0 20.0 1186.0 132.0 26.0 1028.0 29.0 1110.0 155.0 0.917 2.7692 40 39.0 1294.0 108.0 58:30 85.161290 89.655172 92.612613 Corey Crawford NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 1179:36 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 69 NaN NaN NaN 17:05 NaN NaN NaN Travis Zajac 16.0 9.0 28.0 72.0 58.0 1.0 1.0 39:55 942:36 28 52.84 12.5 1.0 0.0 1.0 3.0 197:05 39.0 -12.0 25.0 1476.0 13:39 02:51 00:34
2 1504:25 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 68 NaN NaN NaN 22:07 NaN NaN NaN P.K. Subban 11.0 7.0 79.0 151.0 88.0 2.0 6.0 160:14 1232:41 79 0.00 4.6 3.0 0.0 0.0 0.0 111:30 90.0 -21.0 18.0 1883.0 18:07 01:38 02:21
3 1112:11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 65 NaN NaN NaN 17:06 NaN NaN NaN Kyle Palmieri 20.0 25.0 41.0 155.0 74.0 11.0 18.0 206:17 891:54 41 32.43 16.1 3.0 1.0 0.0 0.0 14:00 36.0 -4.0 45.0 1374.0 13:43 00:12 03:10
4 1020:59 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 51 NaN NaN NaN 20:01 NaN NaN NaN Dmitry Kulikov 8.0 2.0 32.0 54.0 104.0 0.0 0.0 06:20 944:51 32 0.00 3.7 1.0 0.0 0.0 0.0 69:48 77.0 -4.0 10.0 1241.0 18:31 01:22 00:07
5 538:48 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 27 NaN NaN NaN 19:57 NaN NaN NaN Ryan Murray 7.0 2.0 4.0 32.0 12.0 0.0 2.0 23:15 460:25 4 0.00 6.3 0.0 0.0 0.0 0.0 55:08 50.0 -9.0 9.0 708.0 17:03 02:02 00:51
6 1584:26 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 69 NaN NaN NaN 22:57 NaN NaN NaN Damon Severson 23.0 8.0 52.0 114.0 81.0 3.0 10.0 137:22 1277:50 52 0.00 7.0 2.0 0.0 0.0 0.0 169:14 97.0 -20.0 31.0 1924.0 18:31 02:27 01:59
7 417:53 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 29 NaN NaN NaN 14:24 NaN NaN NaN Connor Carrick 5.0 1.0 17.0 25.0 27.0 0.0 0.0 02:29 402:01 17 0.00 4.0 1.0 0.0 0.0 0.0 13:23 39.0 -6.0 6.0 564.0 13:51 00:27 00:05
8 969:45 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 66 NaN NaN NaN 14:41 NaN NaN NaN Nikita Gusev 31.0 13.0 12.0 158.0 12.0 5.0 15.0 164:10 805:25 12 33.33 8.2 2.0 0.0 0.0 0.0 00:10 7.0 -15.0 44.0 1173.0 12:12 00:00 02:29
9 677:27 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 43 NaN NaN NaN 15:45 NaN NaN NaN Andreas Johnsson 13.0 8.0 14.0 78.0 43.0 4.0 5.0 86:53 581:07 14 0.00 10.3 1.0 0.0 0.0 0.0 09:27 21.0 0.0 21.0 897.0 13:30 00:13 02:01
10 1003:22 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 56 NaN NaN NaN 17:55 NaN NaN NaN Will Butcher 17.0 4.0 6.0 62.0 31.0 0.0 1.0 72:35 918:16 6 0.00 6.5 1.0 0.0 0.0 0.0 12:31 75.0 -8.0 21.0 1269.0 16:23 00:13 01:17
11 899:52 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 68 NaN NaN NaN 13:14 NaN NaN NaN Miles Wood 12.0 11.0 57.0 141.0 102.0 0.0 0.0 53:47 841:58 57 0.00 7.8 1.0 0.0 0.0 0.0 04:07 26.0 -19.0 23.0 1169.0 12:22 00:03 00:47
12 1057:23 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 65 NaN NaN NaN 16:16 NaN NaN NaN Pavel Zacha 24.0 8.0 14.0 97.0 62.0 3.0 8.0 106:40 818:37 14 43.27 8.2 1.0 0.0 2.0 4.0 132:06 19.0 -12.0 32.0 1343.0 12:35 02:01 01:38
13 2684:01 8.0 3.0 0.0 22.0 14.0 1328.0 160.0 36.0 1132.0 42.0 1225.0 185.0 0.915 2.7720 47 43.0 1452.0 124.0 57:06 86.486486 85.714286 92.408163 Mackenzie Blackwood NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
14 838:58 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 60 NaN NaN NaN 13:58 NaN NaN NaN Jesper Bratt 16.0 16.0 6.0 101.0 29.0 1.0 6.0 120:47 716:17 6 23.07 15.8 2.0 0.0 0.0 0.0 01:54 22.0 -6.0 32.0 1096.0 11:56 00:01 02:00
15 122:45 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 12 NaN NaN NaN 10:13 NaN NaN NaN Michael McLeod 2.0 0.0 4.0 11.0 19.0 0.0 0.0 00:12 120:51 4 50.00 0.0 0.0 0.0 0.0 0.0 01:42 6.0 4.0 2.0 158.0 10:04 00:08 00:01
16 1047:32 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 58 NaN NaN NaN 18:03 NaN NaN NaN Nico Hischier 22.0 14.0 12.0 123.0 48.0 2.0 10.0 155:56 838:15 12 51.73 11.4 1.0 0.0 1.0 2.0 53:21 37.0 -16.0 36.0 1278.0 14:27 00:55 02:41
17 967:47 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 61 NaN NaN NaN 15:51 NaN NaN NaN Jack Hughes 14.0 7.0 10.0 123.0 12.0 4.0 9.0 193:42 772:59 10 36.14 5.7 2.0 1.0 0.0 0.0 01:06 21.0 -26.0 21.0 1104.0 12:40 00:01 03:10
18 1523:44 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 68 NaN NaN NaN 22:24 NaN NaN NaN Ryan Pulock 25.0 10.0 14.0 163.0 110.0 3.0 8.0 120:08 1302:12 14 0.00 6.1 3.0 1.0 0.0 0.0 101:24 139.0 8.0 35.0 1788.0 19:09 01:29 01:46
19 1106:16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 64 NaN NaN NaN 17:17 NaN NaN NaN Johnny Boychuk 9.0 2.0 14.0 96.0 135.0 1.0 1.0 05:24 968:51 14 0.00 2.1 0.0 0.0 0.0 0.0 132:01 128.0 -11.0 11.0 1420.0 15:08 02:03 00:05
Комментарии:
1. потрясающе, спасибо вам за это, я тоже попробую это!