2012-06-09 84 views
0

首先嚐試學習如何在Visual Studio和C#中使用HTML。我正在使用html agility pack庫。做解析。從財務報表中刮掉HTML

從這個page我試圖在此頁面中拔出從不同的地方的信息,並將其保存爲正確格式的字符串

這裏是我當前的代碼(摘自:shriek

HtmlNode tdNode = document.DocumentNode.DescendantNodes().FirstOrDefault(n => n.Name == "td" 
&& n.InnerText.Trim() == "Net Income"); 
if (tdNode != null) 
{ 
    HtmlNode trNode = tdNode.ParentNode; 
    foreach (HtmlNode node in trNode.DescendantNodes().Where(n => n.NodeType ==  HtmlNodeType.Element)) 
    { 
    Console.WriteLine(node.InnerText.Trim()); 
    //Output: 
    //Net Income 
    //265.00 
    //298.00 
    //601.00 
    //672.00 
    //666.00 
    } 
} 

它正常工作,但我想獲得更多的信息,我不確定如何正確地搜索HTML。首先,我還希望能夠從年度數據中選擇這些數字,而不僅僅是季度數據(頁面頂部的查看選項)。

我也想獲得的日期數字的每一列,既季度和年度(以下簡稱「由於......」在每列的頂部)

也爲未來的項目,並提供谷歌這是一個API嗎?

回答

4

如果你看看原始輸入HTML源代碼仔細看,你會看到它的數據是圍繞是DIV HTML元素具有以下「身份證」的一個6個區構成屬性:「incinterimdiv」「incannualdiv」「 balinterimdiv「」balannualdiv「」casinterimdiv「」「casannualdiv」。很顯然,這些比賽損益表資產負債表現金流爲季刊年度數據。現在,當您使用Html Agility Pack來抓取網站時,我建議您使用XPATH,這是最簡單的方式,可以將HTML代碼中的任何節點,而不依賴於XML,作爲Html Agility Pack支持普通XPATH over HTML

當然,XPATH必須學會,但是非常優雅,因爲它在一行中完成了很多事情。我知道這可能看起來過時了,但是XPATH更加簡潔明瞭。它還使您能夠將代碼與輸入HTML之間的綁定集中在普通的舊字符串中,並避免在輸入源演變時(例如ID發生更改時)重新編譯代碼。這使得你的刮碼更強大,並且面向未來。您還可以將XPATH綁定放入XSL(T)文件中,以便能夠將HTML轉換爲以XML形式呈現的數據。

反正足夠的題外話:)下面是一個示例代碼,允許你從一個特定的行標題獲得的財務數據,而另一個來自所有線路(從6個主要部分之一)獲得的所有數據:

 HtmlWeb web = new HtmlWeb(); 
     HtmlDocument doc = web.Load("http://www.google.com/finance?q=NASDAQ:TXN&fstype=ii"); 

     // How get a specific line: 
     // 1) recursively get all DIV elements with the 'id' attribute set to 'casannualdiv' 
     // 2) get all TABLE elements under, with the 'id' attribute set to 'fs-table' 
     // 3) recursively get all TD elements containing the given text (trimmed) 
     foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='casannualdiv']/table[@id='fs-table']//td[normalize-space(text()) = 'Deferred Taxes']")) 
     { 
      Console.WriteLine("Title:" + node.InnerHtml.Trim()); 

      // get all following sibling TD elements 
      foreach (HtmlNode sibling in node.SelectNodes("following-sibling::td")) 
      { 
       Console.WriteLine(" data:" + sibling.InnerText.Trim()); // InnerText works also for negative values 
      } 
     } 

     // How to get all lines: 
     // 1) recursively get all DIV elements with the 'id' attribute set to 'casannualdiv' 
     // 2) get all TABLE elements under, with the 'id' attribute set to 'fs-table' 
     // 3) recursively get all TD elements containing the class 'lft lm' 
     foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@id='casannualdiv']/table[@id='fs-table']//td[@class='lft lm']")) 
     { 
      Console.WriteLine("Title:" + node.InnerHtml.Trim()); 
      foreach (HtmlNode sibling in node.SelectNodes("following-sibling::td")) 
      { 
       Console.WriteLine(" data:" + sibling.InnerText.Trim()); 
      } 
     } 
+0

偉大的解決方案,您展現了極好的XPath使用。謝謝 – lucas

0

你有兩種選擇。一種是對HTML頁面進行逆向工程,找出當您點擊年度數據時運行的JavaScript代碼,查看從何處獲取數據並請求數據。

第二個更健壯的解決方案是使用像Selenium這樣的平臺,它實際上模擬Web瀏覽器併爲您運行JavaScript。

據我所知,財務報表沒有CSV界面。也許雅虎!有一個。

0

如果你需要導航到正確的頁面,那麼你可能想使用WatiN。 WatiN被設計成一個網頁自動化測試工具,並驅動一個選定的網頁瀏覽器來獲取頁面。它還允許您識別輸入字段並在文本框或按鈕中輸入文本。這很像HtmlAgilityPack,所以你不應該覺得它太難掌握。

+0

害怕它不適用於鉻。這對我來說是一個特殊的需求 – jth41

0

我強烈建議不要這種方法。谷歌正在吐出的HTML可能是高度不穩定的,所以即使一旦你鞏固你的解析方法以獲得你需要的所有數據,在一天,一週或一個月內,HTML格式都可能改變,你需要重寫你的解析邏輯。

你應該嘗試使用更靜態的東西,比如XBRL。

SEC發佈此XBRL在這裏每一個上市公司= http://xbrl.sec.gov/

您可以使用此工具包,編程的數據進行工作 - http://code.google.com/p/xbrlware/

編輯:阻力最小的路徑實際上是使用http://www.xignite.com/xFinancials.asmx,但這項服務需要花錢。