HTML解析利器HtmlAgilityPack
在以前的項(xiàng)目中周公曾有解析HTML的情況,當(dāng)時(shí)是采用正則表達(dá)式一步步將無(wú)關(guān)的HTML注釋及JS代碼部分刪除掉,然后再用正則表達(dá)式找出需要提取的部分,可以說(shuō)使用正則表達(dá)式來(lái)做是一個(gè)比較繁瑣的過(guò)程,特別是對(duì)于正則表達(dá)式不是很熟悉或者要處理的HTML很復(fù)雜的情況下。前一陣子周公還是通過(guò)這個(gè)辦法將http://wz.csdn.net/zhoufoxcn上保存的網(wǎng)址導(dǎo)入到http://cang.baidu.com,本來(lái)還想將周公博客上的文章好好整理一下,但是考慮到使用正則真的是很繁瑣也很麻煩,所以就一直沒(méi)有動(dòng)手。
?直到前兩天在網(wǎng)上發(fā)現(xiàn)了一個(gè).NET下的HTML解析類庫(kù)HtmlAgilityPack。HtmlAgilityPack是一個(gè)支持用XPath來(lái)解析HTML的類庫(kù),在花了一點(diǎn)時(shí)間學(xué)習(xí)了解HtmlAgilityPack的API和XPath之后,周公就做了一個(gè)簡(jiǎn)單的工具完成了這個(gè)功能,目前在CSDN上周公博文的收集地址為:http://blog.csdn.net/zhoufoxcn/archive/2011/06/23/6564578.aspx,在51CTO上周公博文的收集地址為http://zhoufoxcn.blog.51cto.com/792419/595327。HtmlAgilityPack是一個(gè)開(kāi)源的.NET類庫(kù),它的主頁(yè)是http://htmlagilitypack.codeplex.com/,在這里可以下載到最新版的類庫(kù)及API手冊(cè),此外還可以下載到一個(gè)用于調(diào)試的輔助工具。XPath簡(jiǎn)明介紹?XPath 使用路徑表達(dá)式來(lái)選取 XML 文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。節(jié)點(diǎn)是通過(guò)沿著路徑 (path) 或者步 (steps) 來(lái)選取的。
?下面列出了最有用的路徑表達(dá)式:
?nodename:選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)。?
?/:從根節(jié)點(diǎn)選取。?
?//:從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置。?
?.:選取當(dāng)前節(jié)點(diǎn)。?
?..:選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。
?例如有下面一段XML:
??針對(duì)上面的XML文件,我們列出了帶有謂語(yǔ)的一些路徑表達(dá)式,以及表達(dá)式的結(jié)果:
?/Articles/Article[1]:選取屬于Articles子元素的第一個(gè)Article元素。?
?/Articles/Article[last()]:選取屬于Articles子元素的最后一個(gè)Article元素。?
?/Articles/Article[last()-1]:選取屬于Articles子元素的倒數(shù)第二個(gè)Article元素。?
?/Articles/Article[position()<3]:選取最前面的兩個(gè)屬于 bookstore 元素的子元素的Article元素。?
?//title[@lang]:選取所有擁有名為lang的屬性的title元素。?
?//CreateAt[@type='zh-cn']:選取所有CreateAt元素,且這些元素?fù)碛兄禐閦h-cn的type屬性。?
?/Articles/Article[Order>2]:選取Articles元素的所有Article元素,且其中的Order元素的值須大于2。?
?/Articles/Article[Order<3]/Title:選取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值須小于3。HtmlAgilityPack API簡(jiǎn)明介紹?在HtmlAgilityPack中常用到的類有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
?其流程一般是先獲取HTML,這個(gè)可以通過(guò)HtmlDocument的Load()或LoadHtml()來(lái)加載靜態(tài)內(nèi)容,或者也可以HtmlWeb的Get()或Load()方法來(lái)加載網(wǎng)絡(luò)上的URL對(duì)應(yīng)的HTML。
?得到了HtmlDocument的實(shí)例之后,就可以用HtmlDocument的DocumentNode屬性,這是整個(gè)HTML文檔的根節(jié)點(diǎn),它本身也是一個(gè)HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多個(gè)HtmlNode的集合對(duì)象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回單個(gè)HtmlNode。HtmlAgilityPack實(shí)戰(zhàn)?下面是一個(gè)解析CSDN博客的代碼實(shí)例:
??當(dāng)然實(shí)現(xiàn)類似的解析51CTO的博客文章數(shù)據(jù)的代碼如下:
??在上面的代碼中出現(xiàn)了一個(gè)Category類,該類的定義如下:
??為了鼓勵(lì)大家動(dòng)手嘗試以及在本項(xiàng)目中使用了周公的私家類庫(kù),所以不提供全部源代碼下載,這里提供周公操作的最終軟件界面:
?總結(jié):HtmlAgilityPack確實(shí)是一個(gè)功能強(qiáng)大、體積小的開(kāi)源HTML解析類庫(kù),在本篇僅僅是介紹了其中幾個(gè)類的用法,但光這些就足以供周公快速實(shí)現(xiàn)了許久沒(méi)有實(shí)現(xiàn)的功能,如果讓周公用正則表達(dá)式來(lái)實(shí)現(xiàn)類似的功能,時(shí)間肯定要比用這個(gè)長(zhǎng)得多。
?說(shuō)明:周公最近也在琢磨一些關(guān)于微博的應(yīng)用,如果有相同愛(ài)好者或者在使用微博的讀者,請(qǐng)圍觀周公的微博,網(wǎng)址是:http://weibo.com/zhoufoxcn。
?2011-06-24
?周公
本文出自 “周公(周金橋)的專欄” 博客,請(qǐng)務(wù)必保留此出處http://zhoufoxcn.blog.51cto.com/792419/595344
總結(jié)
以上是生活随笔為你收集整理的HTML解析利器HtmlAgilityPack的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 斑斑驾道定制版(斑斑)
- 下一篇: 怎么泡藕粉才是正确的?