2016-11-17 84 views
0

私は、Googleの財務情報からさまざまな株価情報を取得するプログラムを作成しようとしています。これまでのところ私は情報をスパンから得ることができませんでした。現時点では、私はリンゴのストックに直接アクセスするようにハードコーディングしています。アップルの株価へ リンク:私は理解できない何https://www.google.com/finance?q=NASDAQ%3AAAPL&ei=NgItWIG1GIftsAHCn4zIAgXpathでスパンにアクセスしようとするとSystem.ArgumentNullExceptionが発生する(C#)

は、私は次のコマンドでクロムコンソールでそれをしようとしたとき、私は正しい出力を受け取るということです。

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

これはビジュアルで私の現在のコードですHtmlの敏捷性パックとスタジオ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式[テキスト]をしようと私はクロムコンソルを使用しているときに働くことができる出力を受けてきました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-do-i-fix -it) – mybirthname

+0

完全なエラーを投稿する – Danh

+0

「/ * @ [@ id = 'prices'] // table // tr // td」のようなエスケープを避けるには、xpathの中に一重引用符を使用する必要があります – lauda

答えて

0

currDoc.DocumentNode.InnerHtmlの内容を確認すると、idが "appbar"の要素がないことに気づくでしょう。従って、xpathが何も返さないので、結果は正しいです。

あなたが探しているhtml要素は、スクリプト(たとえばjs)によって生成されたものと思われます。なぜなら、HtmlAgilityPackはレンダリングしないので、ブラウザで見ることができ、HtmlDocumentオブジェクトでは見ることができない理由が説明されています。スクリプトは、生のソースコードをダウンロードして解析するだけです。

+0

これは私です恐れている。あなたの答えをありがとう! –