應用範例:解析 Yahoo 奇摩股市的各檔股票資訊-HtmlAgilityPack

筆者認爲這應該是很多撰寫股市資料收集的應用程式的主要標的,若是要由證交所取得資料授權可能要一筆費用,但是由 Yahoo 奇摩股市中解析並讀取資料是免費的,只是 Yahoo 奇摩股市的 HTML 結構長久以來都是鬆散型的,不像 W3C 是 XHTML(之前使用 HTML Agility Pack 讀取是要展示它的功能),所以要剖析它需要花不少腦力,現在我們可以使用 HTML Agility Pack 來將這個工作簡化。

在 Yahoo 奇摩股市中,一個個股的資訊是這樣:

而它的 HTML 結構則是:

因此如果我們要使用 XPath 來解讀它,則需要先使用下列 XPath 先到達上層 table 的位置,再往下取得 HTML 中的內容:

[XPath]

因此我們可以撰寫下列的程式碼:

讀取 Yahoo 奇摩個股資料的程式碼(專案類型:主控臺應用程式)

NOTE

目前 HTML Agility Pack 預設編碼應是法文編碼,所以如果是讀取中文 HTML 內容的話,無法直接使用 HtmlDocument.LoadHtml() 方法,而要透過 MemoryStream 使用 HtmlDocument.Load() 方法,纔可以指定中文的編碼。

有了這個讀取程式後,筆者認爲可以做的事就很多了,像是將它以 XSLT 轉換成不同的 HTML 來顯示,或是存到資料庫中做其他的工作(分析或是圖表輸出等都可以做到)。

由上列程式可以看出,HTML Agility Pack 的使用其實就和 XML DOM 的使用差不了多少,而且也不用再去寫不具親和力的 Regular Expression 的指令,就可以輕鬆的使用 XPath 來解析 HTML,就算是鬆散的 HTML 也可以解析。
NOTE

雖然 HTML Agility Pack 可以解析成功鬆散的 HTML 文件內容,但是請注意,鬆散的 HTML 內容可能會造成 HtmlNode 不是預期的結果,或是在解析表格時,檔頭和內容不同步的現象,這個部份開發人員可能需要多加註意。

 

NOTE

HTML Agility Pack 也可以用來動態產生 HTML 的內容,就如同 XmlDocument 產生 XML 文件內容一樣,它也有像是 CreateElement()、CreateAttribute()、CreateComments() 與 CreateTextNode() 等方法,其使用方式與 XmlDocument 不多,因此筆者在此就不贅述,請參考: http://msdn.microsoft.com/zh-tw/library/t058x2df.aspx

WARNING

本範例程式僅以 Yahoo 奇摩作爲範例標的,實際上若要應用時請注意其內容授權合約與免責條款,筆者僅以此範例展示 HTML Agility Pack 的功能,並不代表使用此範例即等同獲得 Yahoo 奇摩的內容授權,若要引用則請注意是否有合法的內容授權,如因引用範例程式而導致侵權問題,一切責任由引用者自負。

 


輔助工具
HTML Agility Pack 本身有提供一個 HAP Explorer 的工具,可以讓開發人員可以很快的得知要使用的 XPath 語法,以利開發人員利用它來解析 HTML 的位置資訊。

不過筆者認爲這套工具太過於陽春(也許 Simon Mourier 對 Windows Forms 或 WPF 不熟),因此筆者建議配合像 FireFox 或是 IE8 所提供的開發者工具(Developer Tools)來自行建構 XPath 會比較適合,而且它們也都提供可以圈選網頁的某一個部份並標示其 HTML 位置的能力,這樣要建構 XPath 也會比較快。

摘扖網絡:http://msdn.microsoft.com/zh-tw/ee787055.aspx

發佈了70 篇原創文章 · 獲贊 7 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章