电竞比分网-中国电竞赛事及体育赛事平台

分享

解析html和采集網(wǎng)頁的神兵利器

 昵稱10504424 2014-09-24

HtmlAgilityPack是一個基于.Net的、第三 方免費開源的微型類庫,主要用于在服務(wù)器端解析html文檔(在B/S結(jié)構(gòu)的程序中客戶端可以用Javascript解析html)。截止到本文發(fā)表 時,HtmlAgilityPack的最新版本為1.4.0。下載地址:http://htmlagilitypack./

下載后解壓縮后有3個文件,這里只需要將其中的HtmlAgilityPack.dll(程序集)、 HtmlAgilityPack.xml(文檔,用于Visual Studio 2008中代碼智能提示和幫助說明之用)引入解決方案中即可使用,無需安裝任何東西,非?!熬G色環(huán)保”。

在C#類文件開頭引入using HtmlAgilityPack;就可以使用該命名空間下的類型了。實際使用中,幾乎都是以HtmlDocument類為主線的,這一點非常類似于微 軟.net framework中的XmlDocument類。XmlDocument類是操作的是xml文檔,而HtmlDocument類操作的是html文檔 (其實也可以操作xml文檔),它們的操作方式都是基于Dom,所不同的是后者取消了諸如GetElementsByTagName這樣的方法,強化了 GetElementById方法(在HtmlDocument中可以直接使用,而XmlDocument則不可以)。HtmlAgilityPack中 定位節(jié)點基本上都用Xpath表達式,Xpath表達式的參考文檔可見:http://www.w3school.com.cn/xpath/xpath_syntax.asp

例如,我們要采集博客園首頁推薦文章的標題,在ASP.NET中可以編寫如下代碼:

 


這段代碼將采集到的首頁html靜態(tài)文本解析成Dom節(jié)點樹,然后用Xpath表達式獲取整個文檔中class屬性值為titlelnk的 所有a元素。獲取節(jié)點最常用節(jié)點對象的兩個方法:SelectNodes("xpath表達式")和SelectSingleNode("xpath表達 式"),前者返回節(jié)點集合HtmlNodeCollection的一個實例;后者返回滿足條件的第一個節(jié)點,類型為HtmlNode的一個實例。后面的 Foreach循環(huán)輸出每個a元素的內(nèi)聯(lián)文本。

 

通常情況下,HtmlAgilityPack比正則表達式解析html更加高效準確,這體現(xiàn)在開發(fā)效率和運行性能兩方 面。HtmlAgilityPack的靈活性也是非常好的。例如將上面代碼中的foreach循環(huán)體改成 Response.Write(anchor.OuterHtml + "<br/>");則輸出的是超鏈接本身而非內(nèi)聯(lián)文本。甚至可以修改超鏈接本身:


這樣運行后你看到的是紅色的超鏈接。你可以幾乎隨心所欲地對HtmlAgilityPack解析生成的Dom節(jié)點樹上的節(jié)點操作,就像你擁有一顆 自己的圣誕樹,可以隨意對其修整剪裁。這也是正則方法無法相提并論的。HtmlAgilityPack對源文本的結(jié)構(gòu)要求非常寬松,即使沒有根元素也一樣 正常使用,這同要求非常嚴格的XmlDocument完全不同。熟練掌握HtmlAgilityPack解析html文檔的關(guān)鍵在于熟悉Xpath表達式 語法,好在Xpath的語法入門比較簡單,只需花費數(shù)個小時基本就可滿足大部分應(yīng)用。依托于Dom高效而通用的結(jié)構(gòu),Xpath強大而簡練的語 法,HtmlAgilityPack真可以稱為“解析html和采集網(wǎng)頁的神兵利器”。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多