HtmlAgilityPack/xpath
在網上發現了一個.NET下的HTML解析類庫HtmlAgilityPack。HtmlAgilityPack是一個支持用XPath來解析HTML的類庫,在花了一點時間學習了解HtmlAgilityPack的API和XPath之后,周公就做了一個簡單的工具完成了這個功能,目前在CSDN上周公博文的收集地址為:http://blog.csdn.net/zhoufoxcn/archive/2011/06/23/6564578.aspx,在51CTO上周公博文的收集地址為http://zhoufoxcn.blog.51cto.com/792419/595327。HtmlAgilityPack是一個開源的.NET類庫,它的主頁是http://htmlagilitypack.codeplex.com/,在這里可以下載到最新版的類庫及API手冊,此外還可以下載到一個用于調試的輔助工具。
XPath簡明介紹
XPath 使用路徑表達式來選取 XML 文檔中的節點或節點集。節點是通過沿著路徑 (path) 或者步 (steps) 來選取的。
下面列出了最有用的路徑表達式:
nodename:選取此節點的所有子節點。
/:從根節點選取。
//:從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
.:選取當前節點。
..:選取當前節點的父節點。
例如有下面一段XML:
針對上面的XML文件,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果:
/Articles/Article[1]:選取屬于Articles子元素的第一個Article元素。
/Articles/Article[last()]:選取屬于Articles子元素的最后一個Article元素。
/Articles/Article[last()-1]:選取屬于Articles子元素的倒數第二個Article元素。
/Articles/Article[position()<3]:選取最前面的兩個屬于 bookstore 元素的子元素的Article元素。
//title[@lang]:選取所有擁有名為lang的屬性的title元素。
//CreateAt[@type='zh-cn']:選取所有CreateAt元素,且這些元素擁有值為zh-cn的type屬性。
/Articles/Article[Order>2]:選取Articles元素的所有Article元素,且其中的Order元素的值須大于2。
/Articles/Article[Order<3]/Title:選取Articles元素中的Article元素的所有Title元素,且其中的Order元素的值須小于3。
HtmlAgilityPack API簡明介紹
在HtmlAgilityPack中常用到的類有HtmlDocument、HtmlNodeCollection、
HtmlNode和HtmlWeb等。
其流程一般是先獲取HTML,這個可以通過HtmlDocument的Load()或LoadHtml()來加載靜態內容,或者也可以HtmlWeb的Get()或Load()方法來加載網絡上的URL對應的HTML。
得到了HtmlDocument的實例之后,就可以用HtmlDocument的DocumentNode屬性,這是整個HTML文檔的根節點,它本身也是一個HtmlNode,然后就可以利用HtmlNode的SelectNodes()方法返回多個HtmlNode的集合對象HtmlNodeCollection,也可以利用HtmlNode的SelectSingleNode()方法返回單個HtmlNode。
HtmlAgilityPack實戰
下面是一個解析CSDN博客的代碼實例:
當然實現類似的解析51CTO的博客文章數據的代碼如下:
在上面的代碼中出現了一個Category類,該類的定義如下:
為了鼓勵大家動手嘗試以及在本項目中使用了周公的私家類庫,所以不提供全部源代碼下載,這里提供周公操作的最終軟件界面:
總結:HtmlAgilityPack確實是一個功能強大、體積小的開源HTML解析類庫,在本篇僅僅是介紹了其中幾個類的用法,但光這些就足以供周公快速實現了許久沒有實現的功能,如果讓周公用正則表達式來實現類似的功能,時間肯定要比用這個長得多。
說明:周公最近也在琢磨一些關于微博的應用,如果有相同愛好者或者在使用微博的讀者,請圍觀周公的微博,網址是:http://weibo.com/zhoufoxcn。
2011-06-24
周公
轉載于:https://www.cnblogs.com/wangrsh2010/archive/2011/09/22/2184935.html
總結
以上是生活随笔為你收集整理的HtmlAgilityPack/xpath的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 代码设置休眠,几行让An
- 下一篇: RemapKey等:小巧实用的键盘映射工