1. 程式人生 > >Jumony Core 3,真正的HTML引擎,正式版釋出

Jumony Core 3,真正的HTML引擎,正式版釋出

Jumony是一個開源專案,已經有三年的歷史了,在這三年中,秉承提供給.NET程式設計師完整的HTML掌控能力,Jumony歷經無數次的改進,終於進入了一個新的階段。Jumony Core 3是一個真正意義上的HTML引擎。

Jumony Core 3目前已經在NuGet上釋出,請直接在NuGet包管理器中搜索 Jumony Core ,即可下載。

一、解析器

也許很多人會認為,目前的HTML解析器已經足夠了,甚至於簡單的正則,也已經可以滿足操縱HTML文件的需求。是的,對於網際網路上絕大多數的HTML文件,事實上都大部分滿足了XHTML的規範,對於它們的解析,並不需要多麼強大的解析器。但是強大的解析器是一回事,而完美的解析器又是另一回事。

Jumony Core首先提供了一個近乎完美的HTML解析引擎,其解析結果無限逼近瀏覽器的解析結果。不論是無結束標籤的元素,可選結束標籤的元素,或是標記屬性,或是CSS選擇器和樣式,一切合法的,不合法的HTML文件,瀏覽器解析成啥樣,Jumony就解析成啥樣。也就是說,Jumony解析的結果,與瀏覽器解析的結果別無二致,讓你可以再也不用關心HTML文件是否可以被識別,瀏覽器能看,Jumony就能解。

完美和強大隻有一步之遙,但是完美的解析器可以讓你永遠不用關心HTML源文件。

以下是Jumony解析器所支援的特性不完全列表

特性 例子
孤立的<解析為文字
< a應當解析為&lt; a
孤立的>解析為文字 <a>></a>應當解析為<a>&gt;</a>
標記屬性(沒有值的屬性) <input type="text" checked />
元素丟失結束標籤 <div><a href="test.html">測試連結</div>
可選結束標籤元素
"body", "colgroup", "dd", "dt", "head", "html", "li", "option", "p", "tbody", "td", "tfoot", "th", "thead", "tr"
<p>abc<p>123
無結束標籤元素
"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "isindex", "link", "meta", "param", "wbr", "bgsound", "spacer", "keygen"
<img src="1.jpg">
CData元素 <script>if ( 1<a ) alert( "<div>" );</script>
"script", "style", "textarea", "title"
預格式化元素 <pre>    前面有空格</pre>
屬性值使用單引號 <a href='#'>
屬性值使用雙引號 <a href="#"
屬性值不使用引號 <a href=#>
屬性值丟失(但有等號) <a href=>
屬性值前面有空格 <a href= "test.html">
解析HTML宣告 <!DOCTYPE html>

不僅僅是可以從文字中解析HTML,Jumony的API可以從網際網路上直接抓取文件分析,並根據HTTP頭自動識別編碼:

new JumonyParser().LoadDocument( "http://www.cnblogs.com/" ).Find( ".post_item a.titlelnk" )

而目前僅次於Jumony的HTML解析開源專案HtmlAgilityPack早已停止了更新 ,這麼多年過去了,對於最基本的<form>元素的解析都還存在問題。

二、CSS樣式設定支援

僅僅只是完美解析HTML,並不能帶來多少好處,上面已經說過,事實上大部分的HTML文件,都可以用二流的解析器甚至是簡單的正則表示式加以分析,那麼為什麼我們需要Jumony呢?

答案是一個HTML引擎不僅僅是解析DOM結構這麼簡單。

考慮這樣的場景:我需要給一個元素的display樣式設定一個none值。在瀏覽器中,我們只需要簡單的element.style.display = "none"便可以滿足我們的要求。現在,通過解析器已經得到了我們所需要的DOM,但設定樣式還需要進行字串的拼接麼?

不需要,Jumony支援CSS樣式解析,甚至部分CSS樣式縮寫規則也能識別,在Jumony中,給元素設定一個樣式和在瀏覽器中一樣簡單:

element.Style( "display", "none" )

我們再來看這樣的例子:<div style="padding: 5px"></div>,如果我們對這個元素設定padding-left: 0px會怎樣?

在Jumony中,結果會是:<div style="padding-left: 0px; padding-right: 5px; padding-top:5px; padding-bottom: 5px"></div>,看,padding屬性被神奇的自動展開了。

三、CSS 3選擇器支援

CSS選擇器是HTML世界通行的查詢語言,其簡潔有力且被眾多瀏覽器支援。Jumony也支援幾乎完整的CSS3選擇器(除去執行時偽類及偽物件)。藉助選擇器,我們可以輕鬆的在HTML中找到我們感興趣的物件。例如抓取部落格園首頁所有文章標題:

new JumonyParser().LoadDocument( "http://www.cnblogs.com/" ).Find( ".post_item a.titlelnk" )

抓取,分析,選擇,一氣呵成,只需要簡單的程式碼,我們就能在控制檯輸出我們抓取到的資料:

foreach( var title = new JumonyParser().LoadDocument( "http://www.cnblogs.com/" ).Find( ".post_item a.titlelnk" ) )
  Console.WriteLine( title.InnerText() ); 

Jumony支援的CSS3選擇器列表:

選擇器 描述
* 選擇所有元素
p a 選擇子代元素
p>a 選擇子級元素
p+a 選擇相鄰元素
p~a 選擇後繼元素
[attr] 屬性存在選擇
[attr=value] 屬性值精確匹配
[attr~=value] 屬性值近似匹配
[attr^=value] 屬性值開頭匹配
[attr*=value] 屬性值包含匹配
[attr$=value] 屬性值結尾匹配
[attr!=value] 屬性值否定匹配
:not 否定偽類
:only-child 唯一子元素偽類
:only-of-type 唯一型別偽類
:empty 空元素偽類
:nth-child 結構化偽類
:nth-last-child 結構化偽類
:nth-of-type 結構化偽類
:nth-last-of-type 結構化偽類
:first-child 結構化偽類
:last-child 結構化偽類
:first-of-type 結構化偽類
:last-of-type 結構化偽類

四、強大的可擴充套件性

在Jumony Core 3,為使用者提供了最大的可擴充套件性,你可以自定義HTML規範,實現自己的解析器,將其他DOM模型嫁接到Jumony API上,發明自己的CSS選擇器偽類,甚至於自己換一套API,例如jQuery風格的。

Jumony Core擁有許多的衍生專案,例如爬取網站,提供jQuery風格的 API、進行網站開發、製作MHT檔案、為HAP的解析結果增加CSS選擇器支援等等,這些專案都得益於Jumony Core強大的可擴充套件性,從而發揮出強大的功能。

Jumony也提供了一個快速上手的指南,幫助大家快速的熟悉Jumony:

如你所見,這個網站也是採用Jumony進行驅動的,它會檢索網站下所有的HTML頁面,並抽取頁面的標題以及簡介,形成導航目錄和概要頁面。

為了照顧沒有Visual Studio的同學,這裡提供一個壓縮包的下載:

但使用Visual Studio開發的最佳實踐是直接使用NuGet管理你所有的程式包。