Obtenir des données spécifiques d'une page Web avec HTMLAgilityPack

c# html-agility-pack xpath

Question

J'ai essayé d'obtenir des données d'une page Web en C # en utilisant le HTML Agility Pack. J'ai pu récupérer des données de différentes pages Web, mais sur cette page Web, je reçois une NullReferenceException et ma seule NullReferenceException est que cela a quelque chose à voir avec le XPath.

Voici mon code, essayant d'atteindre le texte 'Limbo Wand'

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

Supprimer le text() dans mon XPath ne fonctionne pas, et même essayer d'obtenir le texte à partir de /html/head/title ne fonctionne pas.

Y a-t-il un problème avec mon XPath? Ou est-ce un problème avec la page Web que HTML Agility Pack ne peut pas l'utiliser correctement?

Merci d’avance à tous ceux qui pourront me donner des indices!

Réponse populaire

HtmlWeb est juste de la merde pour aller chercher la source d'un site. Principalement parce qu'il ne gère pas les redirections. Mais je ne suis pas sûr que ce soit le problème sous-jacent ici. Utilisez une demande Web à la place. ainsi:

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);
}

Après cela, vous avez un HtmlDocument. Et vous pouvez facilement obtenir le titre comme ça (puisqu'il n'y a qu'une seule étiquette de titre):

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);
}

Maintenant, obtenir le nom de l'arme en utilisant le chemin le plus simple et le plus facile, serait comme ceci:

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);
}

Le trim () à la fin est juste pour enlever les espaces au début et à la fin de la chaîne.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi