尝试使用Xpath(C#)访问span时出现System.ArgumentNullException

时间:2016-11-17 02:05:32

标签: c# xpath google-finance argumentnullexception

所以我一直试图让一个程序工作,我从谷歌财务获取有关不同股票统计数据的信息。到目前为止,我还没有能够从跨度中获取信息。截至目前,我已经硬编码直接访问苹果股票。 链接到Apple股票:https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=NgItWIG1GIftsAHCn4zIAg

我无法理解的是,当我使用以下命令在chrome控制台中尝试时,我收到了正确的输出:

$x("//*[@id=\"appbar\"]//div//div//div//span");

这是我安装了Html Agility Pack的Visual Studio 2015中的当前代码(我怀疑currDocNodeCompanyName出错):

class StockDataAccess
{
    HtmlWeb web= new HtmlWeb();
    private List<string> testList;

    public void FindStock()
    {
        var histDoc = web.Load("https://www.google.com/finance/historical?q=NASDAQ%3AAAPL&ei=q9IsWNm4KZXjsAG-4I7oCA.html");
        var histDocNode = histDoc.DocumentNode.SelectNodes("//*[@id=\"prices\"]//table//tr//td");

        var currDoc = web.Load("https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=CdcsWMjNCIe0swGd3oaYBA.html");
        var currDocNodeCurrency = currDoc.DocumentNode.SelectNodes("//*[@id=\"ref_22144_elt\"]//div//div");
        var currDocNodeCompanyName = currDoc.DocumentNode.SelectNodes("//*[@id=\"appbar\"]//div//div//div//span");

        var histDocText = histDocNode.Select(node => node.InnerText);
        var currDocCurrencyText = currDocNodeCurrency.Select(node => node.InnerText);
        var currDocCompanyName = currDocNodeCompanyName.Select(node => node.InnerText);

        List<String> result = new List<string>(histDocText.Take(6));
        result.Add(currDocCurrencyText.First());
        result.Add(currDocCompanyName.Take(2).ToString());
        testList = result;
    }

    public List<String> ReturnStock()
    {
        return testList;
    }
}

我一直在尝试使用Xpath表达式[text]并收到一个输出,我可以在使用Chrome控制台时使用但不能在VS中使用。我也一直在尝试foreach循环,有些人向其他人建议。

class StockDataAccess
{
    HtmlWeb web= new HtmlWeb();
    private List<string> testList;

    public void FindStock()
    {
        ///same as before

        var currDoc = web.Load("https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=CdcsWMjNCIe0swGd3oaYBA.html");
        HtmlNodeCollection currDocNodeCompanyName = currDoc.DocumentNode.SelectNodes("//*[@id=\"appbar\"]//div//div//div//span");

        ///Same as before

        List <string> blaList = new List<string>();
        foreach (HtmlNode x in currDocNodeCompanyName)
        {
            blaList.Add(x.InnerText);
        }

        List<String> result = new List<string>(histDocText.Take(6));
        result.Add(currDocCurrencyText.First());
        result.Add(blaList[1]);
        result.Add(blaList[2]);

        testList = result;
    }

    public List<String> ReturnStock()
    {
        return testList;
    }
}

如果有人能指出我正确的方向,我真的很感激。

1 个答案:

答案 0 :(得分:0)

如果检查currDoc.DocumentNode.InnerHtml的内容,你会注意到没有带有id&#34; appbar&#34;的元素,因此结果是正确的,因为xpath没有返回任何内容

我怀疑你试图找到的html元素是由脚本生成的(例如js),这解释了为什么你可以在浏览器上而不是在HtmlDocument对象上看到它,因为HtmlAgilityPack没有渲染脚本,它只下载并解析原始源代码。