使用HTMLAgilityPack從網頁獲取特定數據

c# html-agility-pack xpath

我一直在嘗試使用HTML Agility Pack從C#中的網頁獲取數據。我已經能夠從不同的網頁檢索數據,但在這個網頁上我得到一個NullReferenceException ,我唯一的猜測是它與XPath有關。

這是我的代碼,試圖達到'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

刪除XPath中的text()不起作用,甚至嘗試從/html/head/title獲取文本也不起作用。

我的XPath有什麼問題嗎?或者HTML Agility Pack無法正確使用網頁是否存在問題?

提前感謝任何能夠給我一些提示的人!

熱門答案

HtmlWeb只是用來獲取網站的源代碼。主要是因為它不處理重定向。但我不確定這是潛在的問題。請改用Web請求。像這樣:

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()只是刪除字符串開頭和結尾的空格。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因