Erhalten Sie bestimmte Daten von einer Webseite mit HTMLAgilityPack

c# html-agility-pack xpath

Frage

Ich habe versucht, Daten von einer Webseite in C # mit dem HTML Agility Pack zu erhalten. Ich konnte Daten von verschiedenen Webseiten abrufen, aber auf dieser Webseite NullReferenceException ich eine NullReferenceException und meine einzige Vermutung ist, dass es etwas mit dem XPath zu tun hat.

Hier ist mein Code, der versucht, den 'Limbo Wand'-Text zu erreichen

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

Das Entfernen des text() in meinem XPath funktioniert nicht, und sogar der Versuch, den Text von /html/head/title funktioniert nicht.

Ist etwas falsch mit meinem XPath? Oder ist es ein Problem mit der Webseite, dass HTML Agility Pack es nicht richtig benutzen kann?

Vielen Dank im Voraus an alle, die mir Tipps geben können!

Beliebte Antwort

HtmlWeb ist nur Scheiße für das Abrufen der Quelle einer Website. Hauptsächlich, weil es keine Weiterleitungen behandelt. Aber ich bin mir nicht sicher, dass das hier zugrunde liegende Problem ist. Verwenden Sie stattdessen eine Webanfrage. so:

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

Danach haben Sie ein HtmlDocument. Und Sie können den Titel leicht so erhalten (da es nur einen Title-Tag gibt):

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

Um nun den Waffennamen mit dem einfachsten und einfachsten xpath zu erhalten, wäre das so:

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

Das Trim () am Ende dient nur dazu, das Leerzeichen am Anfang und Ende der Zeichenfolge zu entfernen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum