Вы можете проверить значение класса для каждого td
, чтобы найти вратарей, а также информацию об игроке:
from bs4 import BeautifulSoup as soup
import requests
import typing
d = soup(requests.get('http://www.nhl.com/scores/htmlreports/20172018/RO020001.HTM').text, 'html.parser')
class Player(typing.NamedTuple):
number:int
position:str
name:str
is_goalie:bool
team1, team2 = [[[[b.text, b['class'][0] == 'bold'] for b in c.find_all('td')] for c in i.find_all('tr')] for i in d.find_all('td', {'valign':'top', 'class':'border'})]
new_team1 = [[a for a, _ in i]+[c, [0, 1][d]] for *i, [c, d] in team1]
new_team2 = [[a for a, _ in i]+[c, [0, 1][d]] for *i, [c, d] in team2]
final_team1 = [Player(*[*i, bool(a)]) for *i, a in new_team1[1:]]
final_team2 = [Player(*[*i, bool(a)]) for *i, a in new_team2[1:]]
Вывод:
[Player(number='2', position='D', name='RON HAINSEY', is_goalie=False), Player(number='8', position='D', name='CONNOR CARRICK', is_goalie=False), Player(number='11', position='C', name='ZACH HYMAN', is_goalie=False), Player(number='12', position='C', name='PATRICK MARLEAU', is_goalie=True), Player(number='15', position='L', name='MATT MARTIN', is_goalie=False), Player(number='16', position='C', name='MITCHELL MARNER', is_goalie=False), Player(number='22', position='D', name='NIKITA ZAITSEV', is_goalie=True), Player(number='23', position='C', name='ERIC FEHR', is_goalie=False), Player(number='25', position='L', name='JAMES VAN RIEMSDYK', is_goalie=False), Player(number='28', position='R', name='CONNOR BROWN', is_goalie=False), Player(number='29', position='C', name='WILLIAM NYLANDER', is_goalie=False), Player(number='34', position='C', name='AUSTON MATTHEWS', is_goalie=False), Player(number='42', position='C', name='TYLER BOZAK (A)', is_goalie=False), Player(number='43', position='C', name='NAZEM KADRI', is_goalie=True), Player(number='44', position='D', name='MORGAN RIELLY (A)', is_goalie=False), Player(number='47', position='C', name='LEO KOMAROV (A)', is_goalie=True), Player(number='51', position='D', name='JAKE GARDINER', is_goalie=True), Player(number='55', position='D', name='ANDREAS BORGMAN', is_goalie=False), Player(number='31', position='G', name='FREDERIK ANDERSEN', is_goalie=True), Player(number='35', position='G', name='CURTIS MCELHINNEY', is_goalie=False)]
[Player(number='5', position='D', name='DMITRY KULIKOV', is_goalie=False), Player(number='8', position='D', name='JACOB TROUBA', is_goalie=False), Player(number='9', position='C', name='ANDREW COPP', is_goalie=False), Player(number='13', position='L', name='BRANDON TANEV', is_goalie=False), Player(number='16', position='C', name='SHAWN MATTHIAS', is_goalie=False), Player(number='17', position='L', name='ADAM LOWRY', is_goalie=False), Player(number='18', position='C', name='BRYAN LITTLE', is_goalie=False), Player(number='26', position='R', name='BLAKE WHEELER (C)', is_goalie=True), Player(number='27', position='L', name='NIKOLAJ EHLERS', is_goalie=False), Player(number='29', position='R', name='PATRIK LAINE', is_goalie=False), Player(number='33', position='D', name='DUSTIN BYFUGLIEN (A)', is_goalie=True), Player(number='39', position='D', name='TOBY ENSTROM', is_goalie=True), Player(number='40', position='R', name='JOEL ARMIA', is_goalie=False), Player(number='44', position='D', name='JOSH MORRISSEY', is_goalie=False), Player(number='55', position='C', name='MARK SCHEIFELE (A)', is_goalie=True), Player(number='56', position='C', name='MARKO DANO', is_goalie=False), Player(number='57', position='D', name='TYLER MYERS', is_goalie=False), Player(number='85', position='C', name='MATHIEU PERREAULT', is_goalie=True), Player(number='35', position='G', name='STEVE MASON', is_goalie=True), Player(number='37', position='G', name='CONNOR HELLEBUYCK', is_goalie=False)]