使用HTMLAgilityPack从网页获取特定数据

时间:2017-11-07 13:29:39

标签: c# xpath html-agility-pack

我一直在尝试使用HTML Agility Pack从C#中的网页获取数据。 我已经能够从不同的网页检索数据,但在这个网页上我得到了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

删除XPath中的text()并不起作用,甚至尝试从/html/head/title获取文本也无效。

我的XPath有什么问题吗?或者HTML Agility Pack无法正确使用网页是否存在问题?

提前感谢任何能够给我一些提示的人!

1 个答案:

答案 0 :(得分:0)

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()就是删除字符串开头和结尾的空格。