2011年5月5日 星期四

好用工具:Html Agility Pack,.net平台的Html解析工具。


相信各位程式或多或少都會踫到要剖析html文件然後取得資料的經驗吧。以我為例子,就曾幫朋友寫過一支抓Yahoo股市個股資料的小程式,好讓他上班不必開網頁就可以看股票(此風不可長)。一開始想說直接對Html作字串的分析,想想這樣似乎太遜了,一點高手的風範也沒有。(謎之音…用膝蓋想也知道這種東西一定有剖析器啊。)


要介紹Html Agility Pack函式庫前要先介紹一下這個函式庫的基礎:XPath語法。
W3School這裡有詳細的介紹,當然小弟當初也是在這裡學的。簡而言之,XPath就是一種可以拿來描述Xml文件中任何物件的"路徑"的語言。當然也可以拿來當作搜尋物件的語法,而且與Css選擇器有異曲同工之妙。
當然師父引進門,修行在個人。有興趣的朋友請到Google搜尋一下吧。

再來進入重頭戲:Html Agility Pack
這個函式庫在自我介紹的時候,有強調不必懂xpath語法與XSLT語法。但我想他真正的意思是用之前不必懂,用了之後要用得好的話還是難免要懂的。他的物件模型設計得與XML相彷,所以真的很好上手。接下來當然來實作demo一下:

目標網頁:

取得圖中網頁中所有的所有的連結。

第一步:先將網原始碼存成檔案。當然,你爽的話也可以當下從網路上抓下。交由Html Agility Pack元件解析。


   HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

        string textHtml = System.IO.File.ReadAllText(filePath);

    htmlDoc.LoadHtml(textHtml);


第二步:
因為我目前正在製作網頁的蜘蛛程式,所以我的需求是將頁面上所有的 tag A找出來並取得它的連結。


var link = body.SelectNodes("//a");


 foreach (var item in link)

   {

         string path = item.Attributes["href"].Value;

 }

如此即可取得html中所有的tag a的連結。
其中SelectNodes 這個函式可以使用Xpath語法來選擇物件,其中還有滿多變化的。可以到goolge學習一下。

沒有留言:

張貼留言