public override BoosterPack Parse(HttpClient httpClient) { var html = GetHtml(httpClient); var response = ScraperConstants.HtmlParser.ParseDocument(html); var dom = response.GetElementsByClassName("mw-parser-output").First(); var dates = GetReleaseDates(dom); var table = dom.GetElementsByClassName("card-list").FirstOrDefault()?.FirstElementChild.Children; if (table is null) { throw new NullReferenceException($"No card list exists for {Name}"); } var tableHead = table.First(); var nameIndex = GetColumnIndex(tableHead, "name"); var rarityIndex = GetColumnIndex(tableHead, "rarity"); var cardTable = table.Skip(1); var cards = new List <BoosterPackCard>(); foreach (var row in cardTable) { var name = TrimName(row.Children[nameIndex].TextContent.Trim().Trim('"')); var rarities = rarityIndex == -1 ? null : row.Children[rarityIndex].Children.Select(element => element.TextContent.Trim()).Where(IsNotNullOrEmpty); var card = new BoosterPackCard { Name = name, Rarities = rarities }; cards.Add(card); } return(new BoosterPack() { Name = Name, Dates = dates is null ? null : JsonConvert.SerializeObject(dates), Cards = JsonConvert.SerializeObject(cards), Url = Url });
public override BoosterPack Parse(HttpClient httpClient) { var dom = GetDom(httpClient); var dates = dom.GetElementByClassName("portable-infobox")? .GetElementsByTagName("section") .FirstOrDefault(element => element.FirstElementChild.TextContent.Contains("release date", StringComparison.OrdinalIgnoreCase))? .GetElementsByClassName("pi-data") .ToDictionary(element => element.FirstElementChild.TextContent.Trim(), element => element.LastElementChild.TextContent.Trim()); var table = dom.GetElementByClassName("card-list") ?? dom.GetElementByClassName("wikitable"); var tableHead = table.ClassList.Contains("card-list") ? table.GetElementsByTagName("tbody").FirstOrDefault().FirstElementChild : table.GetElementsByTagName("tbody").FirstOrDefault().Children[1]; var nameIndex = GetColumnIndex(tableHead, "name"); var rarityIndex = GetColumnIndex(tableHead, "rarity"); var cardTable = table.ClassList.Contains("card-list") ? table.GetElementsByTagName("tbody").FirstOrDefault().Children.Skip(1) : table.GetElementsByTagName("tbody").FirstOrDefault().Children.Skip(2); var cards = new List <BoosterPackCard>(); foreach (var cardRow in cardTable) { var name = TrimName(cardRow.Children[nameIndex].TextContent); var rarities = rarityIndex == -1 ? null : cardRow.Children[rarityIndex].Children.Select(element => element.TextContent.Trim()).Where(IsNotNullOrEmpty); var card = new BoosterPackCard { Name = name, Rarities = rarities }; cards.Add(card); } var boosterPack = new BoosterPack() { Name = Name, Dates = dates is null ? null : JsonConvert.SerializeObject(dates), Cards = JsonConvert.SerializeObject(cards), Url = Url }; return(boosterPack); }