private async Task GetCharacterAndSeiyuuInformation(IAnime anime, string username, string password) { try { //Our first task is to retrieve the MAL anime - for now we cheat and grab it from our example data var doc = new HtmlDocument(); var url = anime.AdditionalInfoUrls.CharactersAndStaff; HttpClient webClient; if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password)) { var handler = new HttpClientHandler {Credentials = new NetworkCredential(username, password)}; webClient = new HttpClient(handler); } else { webClient = new HttpClient(); } var data = await webClient.GetStreamAsync(new Uri(url)); doc.Load(data); var tableNodes = doc.DocumentNode.SelectNodes("//table"); foreach (var table in tableNodes) { var rows = table.ChildNodes.Where(t => t.Name == "tr"); //var rows = table.SelectNodes("//tr"); if (rows != null) { foreach (var row in rows) { var columns = row.ChildNodes.Where(t => t.Name == "td").ToList(); if (columns.Count == 3) { var tmpChar = _characterFactory.CreateCharacter(); var charPic = columns[0].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["data-src"]?.Value; if (string.IsNullOrEmpty(charPic)) { charPic = columns[0].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["src"]?.Value; } tmpChar.CharacterPicture = charPic; tmpChar.CharacterName = columns[1].ChildNodes["a"].InnerText; tmpChar.CharacterUrl = columns[1].ChildNodes["a"].Attributes["href"].Value; tmpChar.CharacterType = columns[1].ChildNodes["div"].InnerText; var vaDetail = columns[2].ChildNodes["table"]?.ChildNodes.Where(t => t.Name == "tr").ToList(); if(vaDetail == null) continue; foreach (var detail in vaDetail) { var tmpSeiyuu = _characterFactory.CreateSeiyuu(); tmpSeiyuu.Language = detail.ChildNodes["td"].ChildNodes["small"].InnerText; tmpSeiyuu.Name = detail.ChildNodes["td"].ChildNodes["a"].InnerText; tmpSeiyuu.Url = detail.ChildNodes["td"].ChildNodes["a"].Attributes["href"].Value; var tmpImage = detail.ChildNodes[3].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["data-src"]?.Value; if (string.IsNullOrEmpty(tmpImage)) { tmpImage = detail.ChildNodes[3].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["src"].Value; } tmpSeiyuu.PictureUrl = tmpImage; tmpChar.Seiyuu.Add(tmpSeiyuu); } if(anime.CharacterInformation.Count(t => t.CharacterUrl == tmpChar.CharacterUrl) == 0) anime.CharacterInformation.Add(tmpChar); } } } } } catch (Exception ex) { Log.Error(ex, "Error occured while trying to retrieve character and staff data"); } }