private static void DetermineHomeAndAway(HtmlNode gameStatusNode, MlbTeamShortName mlbTeam, string opponentTeamCity, ref MlbGameSummaryModel game) { //Figure out home/away teams and then return if (gameStatusNode.InnerText.Equals("vs", StringComparison.InvariantCultureIgnoreCase)) { // home game for mlbTeam game.Home = mlbTeam.ToString(); string shortName = MlbAttendanceQuery.LookupShortName(opponentTeamCity); game.Visitor = String.IsNullOrWhiteSpace(shortName) ? opponentTeamCity : shortName; } else if (gameStatusNode.InnerText.Equals("@", StringComparison.InvariantCultureIgnoreCase)) { // away game for mlbTeam string shortName = MlbAttendanceQuery.LookupShortName(opponentTeamCity); game.Home = String.IsNullOrWhiteSpace(shortName) ? opponentTeamCity : shortName; game.Visitor = mlbTeam.ToString(); } }
private static MlbGameSummaryModel ParseRow(HtmlNodeCollection columns, MlbTeamShortName mlbTeam, int seasonYear, bool includeHomeGamesOnly = true) { MlbGameSummaryModel game = new MlbGameSummaryModel(); // Check if this is a home or away game and if we should proceed parsing HtmlNode gameStatusNode = columns[1].SelectSingleNode(@".//li[@class='game-status']"); if (gameStatusNode.InnerText.Equals("@") && includeHomeGamesOnly) { // This is an away game and we don't want to include away games so return null return(null); } // Game Date HtmlNode dateNode = columns[0]; DateTime date = Convert.ToDateTime(dateNode.InnerText + " " + seasonYear); game.Date = date; if (date >= DateTime.Now.Date) // Don't retrieve games from today or future { return(null); } // Determine the Opponent HtmlNode opponentNode = columns[1]; HtmlNode opponentTeamNode = opponentNode.SelectSingleNode(@".//li[@class='team-name']"); string opponentTeamCity = opponentTeamNode.InnerText; // Check if the game was postponed if (columns[2].InnerText.Equals("postponed", StringComparison.InvariantCultureIgnoreCase) || columns[3].InnerText.Equals("delayed", StringComparison.InvariantCultureIgnoreCase) || columns[3].InnerText.Equals("suspended", StringComparison.InvariantCultureIgnoreCase)) { // The game was postponed. Figure out home/away teams and then return game.Postponed = true; MlbAttendanceQuery.DetermineHomeAndAway(gameStatusNode, mlbTeam, opponentTeamCity, ref game); return(game); } else { game.Postponed = false; } // Game Result HtmlNode gameResultNode = columns[2]; HtmlNode scoreNode = gameResultNode.SelectSingleNode(@".//li[contains(@class,'score')]"); // Check if the score can be parsed out and if not then return if (null == scoreNode) { MlbAttendanceQuery.DetermineHomeAndAway(gameStatusNode, mlbTeam, opponentTeamCity, ref game); return(game); } // Check if there were extra innings string score = scoreNode.InnerText; string fToken = "f/"; // This string implies there were extra innings int fIndex = score.IndexOf(fToken, StringComparison.InvariantCultureIgnoreCase); if (fIndex >= 0) { game.Innings = Convert.ToInt32(score.Substring(fIndex + fToken.Length)); score = score.Substring(0, fIndex).Trim(); } else { game.Innings = 9; } int winningScore; int losingScore; try { winningScore = score.Split('-').Max(x => Convert.ToInt32(x)); losingScore = score.Split('-').Min(x => Convert.ToInt32(x)); } catch (FormatException) { winningScore = 0; losingScore = 0; MlbAttendanceQuery.DetermineHomeAndAway(gameStatusNode, mlbTeam, opponentTeamCity, ref game); return(game); } // Figure out if the home team won or lost HtmlNode winLossNode = gameResultNode.SelectSingleNode(@".//li[contains(@class,'game-status')]"); int mlbTeamScore; int opponentScore; if (winLossNode.Attributes["class"].Value.IndexOf("win", StringComparison.InvariantCultureIgnoreCase) >= 0) // case-insensitive 'contains' { mlbTeamScore = winningScore; opponentScore = losingScore; } else if (winLossNode.Attributes["class"].Value.IndexOf("loss", StringComparison.InvariantCultureIgnoreCase) >= 0) // case-insensitive 'contains' { mlbTeamScore = losingScore; opponentScore = winningScore; } else if (winLossNode.Attributes["class"].Value.IndexOf("tie", StringComparison.InvariantCultureIgnoreCase) >= 0) // case-insensitive 'contains' { mlbTeamScore = winningScore; opponentScore = winningScore; } else { throw new Exception("Could not determine win or loss"); } // Get Win-Loss record for mlbTeam HtmlNode winLossRecordNode = columns[3]; string[] winLossRecord = winLossRecordNode.InnerText.Split('-'); if (null != winLossRecord && winLossRecord.Length == 2) { game.WinsToDate = Convert.ToInt32(winLossRecord[0]); game.LossesToDate = Convert.ToInt32(winLossRecord[1]); } else { // do not set any values since we couldn't parse out the win-loss record } // Get pitchers HtmlNode winningPitcherNode = columns[4].SelectSingleNode(@".//a"); game.WPitcher = winningPitcherNode != null ? winningPitcherNode.InnerText : null; HtmlNode losingPitcherNode = columns[5].SelectSingleNode(@".//a"); game.LPitcher = losingPitcherNode != null ? losingPitcherNode.InnerText : null; HtmlNode savingPitcherNode = columns[6].SelectSingleNode(@".//a"); game.SavePitcher = savingPitcherNode != null ? savingPitcherNode.InnerText : null; // Determine home and away teams and which was the winner or loser // Note: gameStatusNode was initialized at the start of the method if (gameStatusNode.InnerText.Equals("vs", StringComparison.InvariantCultureIgnoreCase)) { // home game for mlbTeam game.Home = mlbTeam.ToString(); game.HomeScore = mlbTeamScore; string shortName = MlbAttendanceQuery.LookupShortName(opponentTeamCity); game.Visitor = String.IsNullOrWhiteSpace(shortName) ? opponentTeamCity : shortName; game.VisitorScore = opponentScore; } else if (gameStatusNode.InnerText.Equals("@", StringComparison.InvariantCultureIgnoreCase)) { // away game for mlbTeam string shortName = MlbAttendanceQuery.LookupShortName(opponentTeamCity); game.Home = String.IsNullOrWhiteSpace(shortName) ? opponentTeamCity : shortName; game.HomeScore = opponentScore; game.Visitor = mlbTeam.ToString(); game.VisitorScore = mlbTeamScore; } // Get Attendance Data HtmlNode attendanceNode = columns[7]; int attendance = 0; Int32.TryParse(attendanceNode.InnerText, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out attendance); game.Attendance = attendance; return(game); }