Example #1
0
 private static string BuildIdentifier(Season season, string competition)
 {
     return($"{season.StartYear}/{season.EndYear} - {competition}");
 }
        /// <inheritdoc />
        public Season ConstructSeason()
        {
            // parse website
            var web = new HtmlWeb();
            var doc = web.Load(Url);

            // determine season
            var tableHeader  = doc.DocumentNode.SelectSingleNode("//header/h2").InnerText;
            var seasonString = tableHeader.Substring(tableHeader.Length - 9, 9); // matches to '2018/2019'
            var season       = new Season(seasonString);

            // get and iterate over table of games
            var tbodyNode = doc.DocumentNode.SelectSingleNode("//tbody");

            foreach (var tbodyChildNode in tbodyNode.ChildNodes)
            {
                // ensure a non-empty table
                var trowChildNodes = tbodyChildNode.ChildNodes.Where(x => x.OriginalName == "td").ToList();
                if (trowChildNodes.Count == 0)
                {
                    continue;
                }

                // extract basic game facts
                var date   = trowChildNodes[0].InnerText.Split('-')[0].Split('.');
                var day    = Convert.ToInt32(date[0]);
                var month  = Convert.ToInt32(date[1]);
                var year   = Convert.ToInt32(date[2]);
                var hour   = Convert.ToInt32(trowChildNodes[1].InnerText.Substring(0, 2));
                var minute = Convert.ToInt32(trowChildNodes[1].InnerText.Substring(3, 2));

                // determine participating teams
                var teamsString = "";
                var gameString  = "";
                var teamFinder  = trowChildNodes[2].ChildNodes.Where(x => x.OriginalName == "span" || x.OriginalName == "a").ToList();
                if (teamFinder.Count == 2) // sometimes the root element directly contains two span-objects...
                {
                    gameString  = teamFinder[0].InnerText;
                    teamsString = teamFinder[1].InnerText;
                }
                else if (teamFinder.Count == 1) // and other times one a-object with two nested span-objects
                {
                    gameString  = teamFinder[0].ChildNodes[1].InnerText;
                    teamsString = teamFinder[0].ChildNodes[3].InnerText;
                }

                var teams    = teamsString.Split('-'); // matches to 'Team A - Team B' => afterwards remove leading and trailing whitespaces
                var homeTeam = teams[0].Remove(teams[0].Length - 1, 1);
                var awayTeam = teams[1].Remove(0, 1);

                // find out location of the game (home or away)
                string location;
                string opponent;
                if (homeTeam.Contains("Dynamo Dresden"))
                {
                    location = "Dresden";
                    opponent = awayTeam;
                }
                else
                {
                    location = homeTeam;
                    opponent = homeTeam;
                }

                // ignore 'Testspiele'
                if (gameString.Split('-')[0].StartsWith("Test"))
                {
                    continue;
                }

                // each game gets it's unique identifier
                var identifier = $"{season.StartYear}/{season.EndYear} - {gameString}";

                season.Games.Add(new Game(new DateTime(year, month, day, hour, minute, 0), location, opponent, identifier));
            }

            return(season);
        }