Получить конкретные данные с веб-страницы с помощью HTMLAgilityPack

c# html-agility-pack xpath

Вопрос

Я пытаюсь получить данные с веб-страницы на C #, используя пакет Agility Pack. Мне удалось получить данные с разных веб-страниц, но на этой веб-странице я получаю NullReferenceException и я только предполагаю, что он имеет какое-то отношение к XPath.

Вот мой код, пытаясь достичь текста «Лимбо-палочки»

string url = "https://www.dofus.com/en/mmorpg/encyclopedia/weapons/180-limbo-wand";
HtmlWeb htmlWeb = new HtmlWeb();
HtmlDocument doc = htmlWeb.Load(url);

string weaponName = doc.DocumentNode.SelectNodes("/html/body/div[2]/div[2]/div/div/div/main/div[2]/div/div[2]/h1/text()")[0].InnerText; // <-- NullReferenceException here

Удаление text() в моем XPath не работает, и даже попытка получить текст из /html/head/title не работает.

Что-то не так с моим XPath? Или проблема с веб-страницей заключается в том, что HTML Agility Pack не может использовать ее правильно?

Заранее благодарю всех, кто может дать мне несколько советов!

Популярные ответы

HtmlWeb - просто дерьмо за выбор источника сайта. В основном потому, что он не обрабатывает перенаправления. Но я не уверен, что здесь основная проблема. Вместо этого используйте веб-запрос. вот так:

HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
try
{
    var request = (HttpWebRequest)WebRequest.Create("https://www.dofus.com/en/mmorpg/encyclopedia/weapons/180-limbo-wand");
    request.Method = "GET";

    using (var response = (HttpWebResponse)request.GetResponse())
    {
        using (var stream = response.GetResponseStream())
        {
            doc.Load(stream, Encoding.GetEncoding("iso-8859-9"));
        }
    }
}
catch (WebException ex)
{
    Console.WriteLine(ex.Message);
}

После этого у вас есть HtmlDocument. И вы можете легко получить заголовок так (так как есть только один тег названия):

Console.WriteLine(doc.DocumentNode.SelectNodes("/title")[0].InnerText);

Теперь, чтобы получить название оружия, используя самый простой и простой xpath, вы бы хотели:

Console.WriteLine(doc.DocumentNode.SelectSingleNode("//h1[@class='ak-return-link']").InnerText.Trim());

Trim () в конце - это просто удалить пробелы в начале и в конце строки.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему