C#希望使用HtmlAgilityPack获取<div>值但接收System.NullReferenceException

时间:2018-03-02 00:11:11

标签: c# html-agility-pack

我试图获得div类“darkgreen”的值,即46.98。我尝试了以下代码,但我得到了一个N​​ull异常。

div

以下是我正在尝试的代码:

private void button1_Click(object sender, EventArgs e)
{

    var doc = new HtmlWeb().Load("https://rotogrinders.com/grids/nba-defense-vs-position-cheat-sheet-1493632?site=fanduele");
    HtmlAgilityPack.HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//div[@class='darkgreen']");
    foreach (HtmlAgilityPack.HtmlNode node in nodes)
    {
        Console.WriteLine(node.InnerText);
    }
}

如果我使用doc.DocumentNode.SelectNodes(“// div [@ class ='rgt-hdr colorize']”)运行相同的代码,它确实会没有错误地提取标题数据。

我在想,也许子节点可能是一个解决方案,但我不确定,因为我无法让它继续工作。

1 个答案:

答案 0 :(得分:1)

您的问题是您查找的HTML是由javascript创建的。您加载到Document变量中的HTML是由javascript创建的。如果您在Web浏览器中查看页面源代码,您将看到在HtmlDocument变量中加载的确切HTML。

下面的示例将为您提供用于创建表的数据(JSON)。我不知道这对你想要做的事情是否足够。

    public static void Main(string[] args)
    {
        Console.WriteLine("Program Started!");

        HtmlDocument doc;
        doc = new HtmlWeb().Load("https://rotogrinders.com/grids/nba-defense-vs-position-cheat-sheet-1493632?site=fanduele");
        HtmlNode node = doc.DocumentNode.SelectSingleNode("//section[@class='bdy content article full cflex reset long table-page']/following-sibling::script[1]");
        int start = node.InnerText.IndexOf("[");
        int length = node.InnerText.IndexOf("]") - start +1;
        Console.WriteLine(node.InnerText.Substring(start, length));

        Console.WriteLine("Program Ended!");
        Console.ReadKey();
    }

替代解决方案

或者您可以将Selenium与PhantomJS一起使用。然后将HTML从无头浏览器加载到您的文档变量中,然后您的xpath将起作用。