首先介紹一下Jumony是什麼,Jumony是一個.NET的開源項目,項目主頁位於:http://jumony.codeplex.com/,採用LGPL協議發佈。html
Jumony試圖提供在傳統Web開發模型中許多難以解決問題的解決方案。一言蔽之,Jumony的一切基礎創建在服務器端的HTML DOM之上。在服務器端將HTML(文件或動態網頁技術的輸出)按照客戶端瀏覽器的處理方式解析爲HTML DOM。操縱和處理HTML DOM,就像咱們在客戶端用JavaScript乾的那些事情同樣,不一樣的是,Jumony可使你依託強大的.NET Framework,來解決之前用腳本和服務器端技術都難以解決的事情。瀏覽器
系列目錄:服務器
這是系列文章的第三篇,這個系列嘗試一步步從一些最簡單的例子開始瞭解怎麼玩轉Jumony。建議先從第一篇開始學習搭建Jumony環境,在本文的開始的時候,假設你們已經搭建好了Jumony的運行環境。網站
這一次我要談到Jumony的HTML解析器,顯然我本身寫的簡單的符合規範的HTML並不能說明解析器的功能。因此這一次我直接從互聯網上隨便抓一個頁面來完成示範。ui
首先在項目中添加一個aspx文件,而後在上面放一個DataGrid來展現咱們一下子要抓取的成果,像是這樣:code
那麼接下來,咱們到Code Behind裏面來添加一些代碼,首先是要下載一個互聯網的頁面,我用新浪的首頁來作示範,事實上你也能夠換成任何你喜歡網站(例如博客園),下載網頁最簡單的方式固然是WebClient,不過記得添加using System.Net哦,同時我也把Jumony的一些引用都添加上了,像這樣:htm
而後建立JumonyParser的實例,並調用其Parse方法將html分析成一個IHtmlDocument:對象
Jumony Milestone 1除了提供Jumony Parser分析HTML文檔以外,還能夠把HtmlAgilityPack分析的文檔轉換成Jumony的標準DOM模型。這使得HtmlAgilityPack也能夠看成Jumony的一個Parser來使用,下面的代碼展現了這一點:
不過,這麼作以前要確保你引用了Ivony.Web.Html.HtmlAgilityPackAdaptor命名空間,AsDocument擴展方法即是在其中定義的。
HtmlAgilityPackAdaptor爲HtmlAgilityPack的DOM對象提供了一個適配器,使得其能夠知足Jumony標準DOM的要求,從而使用Jumony的方法來操做。理論上全部的HTML DOM和Parser均可以經過適配項目與Jumony適配。
這兩種HTML Parser各有優劣,你們能夠任選一種來完成這一次的例子。在這裏我使用Jumony Parser來繼續下面的例子。
分析了新浪的首頁後,接下來就要幹壞事了,首先把新浪首頁上全部的連接所有取出來。因爲連接都是<a>定義的,因此簡單的用Find( "a" )就能夠選擇出來。但<a>除了能夠定義連接,還能夠定義錨點,咱們並不須要取出頁面上的錨點。因此咱們用"a[href]",即包含href屬性的a標籤:
而後咱們分析這些連接,將其目標URL取出來(即href屬性),因爲href多是一個相對連接,因此咱們用頁面的地址 "http://www.sina.com.cn/" 做爲基地址,從新計算出絕對的URL,而後我用LINQ表達式來對全部URL完成這樣的操做,再放在一個匿名對象中:
能夠看得出來,這些工做在服務器端完成的時候,是多麼的簡潔流暢,一鼓作氣。若是在客戶端來完成這種事情,沒有強大的.NET Framework做爲後盾,一個簡單的URL計算就能夠難倒無數英雄好漢。
而後再爲匿名對象添加一些其餘有趣的屬性,對連接排序,最後綁定到DataGrid上,最終的代碼像這樣:
因爲DataGrid有自動生成列的特性,因此咱們並不須要作些什麼,它會自動的弄一個表格來展示這些數據,效果像是這樣:
把抓取的網頁換成博客園首頁:
Jumony的確能夠用來幹各類各樣的壞事,譬如說抓取頁面,分析數據,或是新聞小偷什麼的。從這一點來講,你能夠說Jumony是邪惡的,但軟件原本就是邪惡的,Jumony將一些很複雜的事情,提供了簡單的解決方案,也許,這下降了幹壞事的成本,但更多的時候,Jumony帶來了生產力的飛躍。藉助Jumony,咱們能作的好玩的事情,要比這些邪惡的事情多多了不是麼?
謝謝你們。