HtmlAgilityPack是一個基于.Net的、第三方免費開源的微型類庫,主要用于在服務器端解析html文檔(在B/S結構的程序中客戶端可以用javascript解析html)。截止到本文發表時,HtmlAgilityPack的最新版本為1.4.0。下載地址:http://htmlagilitypack.codeplex.com/
下載后解壓縮后有3個文件,這里只需要將其中的HtmlAgilityPack.dll(程序集)、HtmlAgilityPack.xml(文檔,用于Visual Studio 2008中代碼智能提示和幫助說明之用)引入解決方案中即可使用,無需安裝任何東西,非常“綠色環保”。
在C#類文件開頭引入using HtmlAgilityPack;就可以使用該命名空間下的類型了。實際使用中,幾乎都是以HtmlDocument類為主線的,這一點非常類似于微軟.net framework中的XmlDocument類。XmlDocument類是操作的是xml文檔,而HtmlDocument類操作的是html文檔(其實也可以操作xml文檔),它們的操作方式都是基于Dom,所不同的是后者取消了諸如GetElementsByTagName這樣的方法,強化了GetElementById方法(在HtmlDocument中可以直接使用,而XmlDocument則不可以)。HtmlAgilityPack中定位節點基本上都用Xpath表達式,Xpath表達式的參考文檔可見:http://m.survivalescaperooms.com.cn/xpath/xpath_syntax.asp
例如,我們要采集博客園首頁推薦文章的標題,在asp.net中可以編寫如下代碼:
[csharp]view plaincopy這段代碼將采集到的首頁html靜態文本解析成Dom節點樹,然后用Xpath表達式獲取整個文檔中class屬性值為titlelnk的所有a元素。獲取節點最常用節點對象的兩個方法:SelectNodes("xpath表達式")和SelectSingleNode("xpath表達式"),前者返回節點集合HtmlNodeCollection的一個實例;后者返回滿足條件的第一個節點,類型為HtmlNode的一個實例。后面的Foreach循環輸出每個a元素的內聯文本。
通常情況下,HtmlAgilityPack比正則表達式解析html更加高效準確,這體現在開發效率和運行性能兩方面。HtmlAgilityPack的靈活性也是非常好的。例如將上面代碼中的foreach循環體改成Response.Write(anchor.OuterHtml + "<br/>");則輸出的是超鏈接本身而非內聯文本。甚至可以修改超鏈接本身:
[csharp]view plaincopy這樣運行后你看到的是紅色的超鏈接。你可以幾乎隨心所欲地對HtmlAgilityPack解析生成的Dom節點樹上的節點操作,就像你擁有一顆自己的圣誕樹,可以隨意對其修整剪裁。這也是正則方法無法相提并論的。HtmlAgilityPack對源文本的結構要求非常寬松,即使沒有根元素也一樣正常使用,這同要求非常嚴格的XmlDocument完全不同。熟練掌握HtmlAgilityPack解析html文檔的關鍵在于熟悉Xpath表達式語法,好在Xpath的語法入門比較簡單,只需花費數個小時基本就可滿足大部分應用。依托于Dom高效而通用的結構,Xpath強大而簡練的語法,HtmlAgilityPack真可以稱為“解析html和采集網頁的神兵利器”。
新聞熱點
疑難解答