Jumony入門(三)初探解析器

weixin_34344677發表於2010-12-22

首先介紹一下Jumony是什麼,Jumony是一個.NET的開源專案,專案主頁位於:http://jumony.codeplex.com/,採用LGPL協議釋出。

Jumony試圖提供在傳統Web開發模型中許多難以解決問題的解決方案。一言蔽之,Jumony的一切基礎建立在伺服器端的HTML DOM之上。在伺服器端將HTML(檔案或動態網頁技術的輸出)按照客戶端瀏覽器的處理方式解析為HTML DOM。操縱和處理HTML DOM,就像我們在客戶端用JavaScript乾的那些事情一樣,不同的是,Jumony可以使你依託強大的.NET Framework,來解決以前用指令碼和伺服器端技術都難以解決的事情。

系列目錄:

Jumony入門(一)從這裡開始

Jumony入門(二)初識選擇器

 

這是系列文章的第三篇,這個系列嘗試一步步從一些最簡單的例子開始瞭解怎麼玩轉Jumony。建議先從第一篇開始學習搭建Jumony環境,在本文的開始的時候,假設大家已經搭建好了Jumony的執行環境。

 

這一次我要談到Jumony的HTML解析器,顯然我自己寫的簡單的符合規範的HTML並不能說明解析器的功能。所以這一次我直接從網際網路上隨便抓一個頁面來完成示範。

 

首先在專案中新增一個aspx檔案,然後在上面放一個DataGrid來展示我們一會兒要抓取的成果,像是這樣:

imageimage

 

那麼接下來,我們到Code Behind裡面來新增一些程式碼,首先是要下載一個網際網路的頁面,我用新浪的首頁來做示範,事實上你也可以換成任何你喜歡網站(例如部落格園),下載網頁最簡單的方式當然是WebClient,不過記得新增using System.Net哦,同時我也把Jumony的一些引用都新增上了,像這樣:

image

 

然後建立JumonyParser的例項,並呼叫其Parse方法將html分析成一個IHtmlDocument:

image

Jumony Milestone 1除了提供Jumony Parser分析HTML文件之外,還可以把HtmlAgilityPack分析的文件轉換成Jumony的標準DOM模型。這使得HtmlAgilityPack也可以當作Jumony的一個Parser來使用,下面的程式碼展示了這一點:

image

不過,這麼做之前要確保你引用了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標籤:

image

然後我們分析這些連結,將其目標URL取出來(即href屬性),由於href可能是一個相對連結,所以我們用頁面的地址 "http://www.sina.com.cn/" 作為基地址,重新計算出絕對的URL,然後我用LINQ表示式來對所有URL完成這樣的操作,再放在一個匿名物件中:

image

可以看得出來,這些工作在伺服器端完成的時候,是多麼的簡潔流暢,一氣呵成。如果在客戶端來完成這種事情,沒有強大的.NET Framework作為後盾,一個簡單的URL計算就可以難倒無數英雄好漢。

 

然後再為匿名物件新增一些其他有趣的屬性,對連結排序,最後繫結到DataGrid上,最終的程式碼像這樣:

image

由於DataGrid有自動生成列的特性,所以我們並不需要做些什麼,它會自動的弄一個表格來展現這些資料,效果像是這樣:

imageimage

 

把抓取的網頁換成部落格園首頁:

image

 

寫在最後

Jumony的確可以用來幹各種各樣的壞事,譬如說抓取頁面,分析資料,或是新聞小偷什麼的。從這一點來說,你可以說Jumony是邪惡的,但軟體本來就是邪惡的,Jumony將一些很複雜的事情,提供了簡單的解決方案,也許,這降低了幹壞事的成本,但更多的時候,Jumony帶來了生產力的飛躍。藉助Jumony,我們能做的好玩的事情,要比這些邪惡的事情多多了不是麼?

謝謝大家。

相關文章