Source code for nhlscrapi.scrapr.rosterrep
from nhlscrapi._tools import exclude_from as ex_junk
from nhlscrapi.scrapr.officialsparser import official_parser_mapper as opm
from nhlscrapi.scrapr.reportloader import ReportLoader
class RosterRep(ReportLoader):
[docs] """Retrieve and load roster report from nhl.com. This is a base class and not intended to be used directly."""
def __init__(self, game_key):
super(RosterRep, self).__init__(game_key, 'game_roster')
self.rosters = { }
"""
Rosters for both home and away.
Data: ``{ 'home/away': { num: { 'pos': '', 'name': '' } } }``
"""
self.scratches = { }
"""Dictionary of healthy scratches keyed home/away loaded"""
self.coaches = { }
"""Dictionary of coaches keyed home/away loaded"""
self.officials = { 'refs': { }, 'linesman': { } }
"""Game officials: ``{ 'refs': { }, 'linesman': { } }``"""
self.__blocks = {}
def __pl_blocks(self, doc):
bls = doc.xpath('//td[text()="#"]')
# roster page layout
# AWAY ROSTER | HOME ROSTER
# AWAY SCRATCH | HOME SCRATCH
bl_k = { 1: 'away', 2: 'home', 3: 'aw_scr', 4: 'h_scr' }
# clean blocks
for i, bl in enumerate(bls):
table = bl.xpath('../..')[0]
self.__blocks[bl_k[i+1]] = table
def __clean_pl_block(self, bl):
def no_letter(s):
s = s.strip()
return '(C)' not in s and '(A)' not in s
r = { }
for p in bl:
txt = p.xpath('.//text()')
if len(txt) and '#' not in txt[0]:
txt = ex_junk(txt, ['\r','\n'])
txt[2] = ' '.join(s.strip() for s in txt[2].split(' ') if no_letter(s))
# need some unique key
num = int(txt[0]) if txt[0].isdigit() else max(r.keys())+1
r[num] = { 'position': txt[1], 'name': txt[2] }
return r
def parse(self):
[docs] """
Retreive and parse Play by Play data for the given :py:class:`nhlscrapi.games.game.GameKey``
:returns: ``self`` on success, ``None`` otherwise
"""
try:
return super(RosterRep, self).parse() \
.parse_rosters() \
.parse_scratches() \
.parse_coaches() \
.parse_officials()
except:
return None
def parse_rosters(self):
[docs] """
Parse the home and away game rosters
:returns: ``self`` on success, ``None`` otherwise
"""
lx_doc = self.html_doc()
if not self.__blocks:
self.__pl_blocks(lx_doc)
for t in ['home', 'away']:
self.rosters[t] = self.__clean_pl_block(self.__blocks[t])
return self if self.rosters else None
def parse_scratches(self):
[docs] """
Parse the home and away healthy scratches
:returns: ``self`` on success, ``None`` otherwise
"""
lx_doc = self.html_doc()
if not self.__blocks:
self.__pl_blocks(lx_doc)
for t in ['aw_scr', 'h_scr']:
ix = 'away' if t == 'aw_scr' else 'home'
self.scratches[ix] = self.__clean_pl_block(self.__blocks[t])
return self if self.scratches else None
def parse_coaches(self):
[docs] """
Parse the home and away coaches
:returns: ``self`` on success, ``None`` otherwise
"""
lx_doc = self.html_doc()
tr = lx_doc.xpath('//tr[@id="HeadCoaches"]')[0]
for i, td in enumerate(tr):
txt = td.xpath('.//text()')
txt = ex_junk(txt, ['\n','\r'])
team = 'away' if i == 0 else 'home'
self.coaches[team] = txt[0]
return self if self.coaches else None
def parse_officials(self):
[docs] """
Parse the officials
:returns: ``self`` on success, ``None`` otherwise
"""
# begin proper body of method
lx_doc = self.html_doc()
off_parser = opm(self.game_key.season)
self.officials = off_parser(lx_doc)
return self if self.officials else None