Во-первых: используйте все, что вам больше всего нравится с HAP против AngleSharp, если только время не является решающим фактором в вашем приложении.И в этом случае это не так.
Второе: используйте веб-отладчик, такой как Fiddler или Charles, чтобы понять, что вы на самом деле получаете, когда делаете запрос.Поскольку вы на самом деле не получаете HTML, созданный с помощью вызовов JavaScript или API.Вы получаете только исходный код страницы.Вот почему таблицы пусты.Они генерируются с помощью любого javascript.
Например.Я просто использовал веб-отладчик, чтобы увидеть, что сайт делает вызов API:
http://www.oddsmath.com/api/v1/dropping-odds.json/?sport_type=soccer&provider_id=7&cat_id=0&interval=60&sortBy=1&limit=30&language=en
Затем javascript будет использовать этот объект json для создания остальной части страницы.
И это возвращаетхороший объект json, с которым легче ориентироваться, чем с помощью eithr HAP или AngleSharp.Я рекомендую использовать NewtonSoft JSON.
Если вы непреклонны в использовании HtmlAgilityPack, вам нужно объединить его с Selenium.Потому что тогда вы можете подождать, пока страница полностью загрузится, прежде чем разбирать HTML.
[Edit] Дальнейшее копание:
Api-запрос на получение всех лиг и ихидентификаторы:
http://www.oddsmath.com/api/v1/menu-leagues.json/?language=en
Api-запрос только для лиги чемпионов Азии:
http://www.oddsmath.com/api/v1/events-by-league.json/?language=en&country_code=GB&league_id=1053
Другое решение с Selenium с драйвером Firefox.
Даже если я настоятельно рекомендую вамиспользуйте API и NewtonSoft-JSON для своего решения. Я расскажу, как это можно сделать с помощью Selenium.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HtmlAgilityPack;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium;
using System.Threading;
namespace SeleniumHap {
class Program {
static void Main(string[] args)
{
HtmlDocument doc = new HtmlDocument();
string url = "http://www.oddsmath.com/football/sweden/division-1-1195/2019-04-26/if-sylvia-vs-nykopings-bis-2858046/";
//string url = "http://www.oddsmath.com/";
FirefoxOptions options = new FirefoxOptions();
//options.AddArguments("--headless");
IWebDriver driver = new FirefoxDriver(options);
driver.Navigate().GoToUrl(url);
while (true) {
doc.LoadHtml(driver.PageSource);
HtmlNode n = doc.DocumentNode.SelectSingleNode("//table[@id='table-odds-cat-0']//*[self::th or self::td]");
if (n != null) {
n = n.SelectSingleNode(".//div[@class='live-odds-loading']");
if (n == null) {
break;
}
}
Thread.Sleep(1000);
}
Console.WriteLine("Exited loop. Meaning the page is done loading since we could get a td. A Crude method but it works");
HtmlNodeCollection tables = doc.DocumentNode.SelectNodes("//table");
foreach(HtmlNode table in tables) {
Console.WriteLine(table.GetAttributeValue("id", "No id"));
HtmlNodeCollection tableContent = table.SelectNodes(".//*[self::th or self::td]");
foreach(HtmlNode n in tableContent) {
Console.WriteLine(n.InnerHtml);
}
break;
}
Console.ReadKey();
}
}
}
Как видите, я использую Firefox в качестве драйвера вместо хрома.При использовании любого из них вам, возможно, придется изменить параметры, в которых вы изменяете переменную 'BrowserExecutableLocation' , чтобы указать, где находится исполняемый файл браузера.Как вы можете видеть, я использую цикл while, чтобы убедиться, что браузер полностью загружает страницу, прежде чем продолжить чтение html.