1. 程式人生 > >HtmlAgilityPack——解析html和採集網頁的神兵利器

HtmlAgilityPack——解析html和採集網頁的神兵利器

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://www.w3school.com.cn/xpath/xpath_syntax.asp

例如,我們要採集部落格園首頁推薦文章的標題,在ASP.NET中可以編寫如下程式碼:

  1. HtmlWeb htmlWeb = new HtmlWeb();  
  2. HtmlDocument htmlDoc = htmlWeb.Load(@"http://www.cnblogs.com/");  
  3. HtmlNodeCollection anchors = htmlDoc.DocumentNode.SelectNodes(@"//a[@class='titlelnk']");  
  4. foreach (HtmlNode anchor 
    in anchors)  
  5.     Response.Write(anchor.InnerHtml + "<br/>");  
  6. Response.End();  

這段程式碼將採集到的首頁html靜態文字解析成Dom節點樹,然後用Xpath表示式獲取整個文件中class屬性值為titlelnk的所有a元素。獲取節點最常用節點物件的兩個方法:SelectNodes("xpath表示式")和SelectSingleNode("xpath表示式"),前者返回節點集合HtmlNodeCollection的一個例項;後者返回滿足條件的第一個節點,型別為HtmlNode的一個例項。後面的Foreach迴圈輸出每個a元素的內聯文字。

通常情況下,HtmlAgilityPack比正則表示式解析html更加高效準確,這體現在開發效率和執行效能兩方面。HtmlAgilityPack的靈活性也是非常好的。例如將上面程式碼中的foreach迴圈體改成Response.Write(anchor.OuterHtml + "<br/>");則輸出的是超連結本身而非內聯文字。甚至可以修改超連結本身:

  1. foreach (HtmlNode anchor in anchors)  
  2. {  
  3.     anchor.Attributes.Add("style""color:red");  
  4.     Response.Write(anchor.OuterHtml + "<br/>");  
  5. }  

這樣執行後你看到的是紅色的超連結。你可以幾乎隨心所欲地對HtmlAgilityPack解析生成的Dom節點樹上的節點操作,就像你擁有一顆自己的聖誕樹,可以隨意對其修整剪裁。這也是正則方法無法相提並論的。HtmlAgilityPack對源文字的結構要求非常寬鬆,即使沒有根元素也一樣正常使用,這同要求非常嚴格的XmlDocument完全不同。熟練掌握HtmlAgilityPack解析html文件的關鍵在於熟悉Xpath表示式語法,好在Xpath的語法入門比較簡單,只需花費數個小時基本就可滿足大部分應用。依託於Dom高效而通用的結構,Xpath強大而簡練的語法,HtmlAgilityPack真可以稱為“解析html和採集網頁的神兵利器”。