2016-11-17 36 views
0

所以我一直在努力获得一个程序工作,我从谷歌财经关于不同的股票统计信息。到目前为止,我还没有能够获得跨越的信息。截至目前,我已经硬编码直接访问苹果股票。 链接到苹果公司的股票:https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=NgItWIG1GIftsAHCn4zIAgSystem.ArgumentNullException当试图访问跨度与Xpath(C#)

什么我不明白的是,我收到的时候我用下面的命令尝试它在Chrome控制台正确的输出:

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

这是我当前的代码在Visual 2015年工作室使用HTML敏捷性包安装(我怀疑在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表达式(文本)和接收的输出,我可以使用Chrome康寿时一起工作e但不在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

可能重复[什么是NullReferenceException,以及如何解决它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix -it) – mybirthname

+0

发布完整的错误 – Danh

+0

您应该在xpath的内部使用单引号以避免转义,如“// * [@ id ='prices'] // table // tr // td”) – lauda

回答

0

如果您检查currDoc.DocumentNode.InnerHtml的内容,您会注意到没有元素的id为“appbar”,因此结果是正确的,因为xpath不返回任何内容。

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

+0

这就是我害怕。谢谢您的回答! –