Jumony是一個開源項目,已經有三年的歷史了,在這三年中,秉承提供給.NET程序員完整的HTML掌控能力,Jumony歷經無數次的改進,終於進入了一個新的階段。Jumony Core 3是一個真正意義上的HTML引擎。html
Jumony Core 3目前已經在NuGet上發佈,請直接在NuGet包管理器中搜索 Jumony Core ,便可下載。git
項目地址:https://github.com/Ivony/Jumony程序員
也許不少人會認爲,目前的HTML解析器已經足夠了,甚至於簡單的正則,也已經能夠知足操縱HTML文檔的需求。是的,對於互聯網上絕大多數的HTML文檔,事實上都大部分知足了XHTML的規範,對於它們的解析,並不須要多麼強大的解析器。可是強大的解析器是一回事,而完美的解析器又是另外一回事。github
Jumony Core首先提供了一個近乎完美的HTML解析引擎,其解析結果無限逼近瀏覽器的解析結果。不管是無結束標籤的元素,可選結束標籤的元素,或是標記屬性,或是CSS選擇器和樣式,一切合法的,不合法的HTML文檔,瀏覽器解析成啥樣,Jumony就解析成啥樣。也就是說,Jumony解析的結果,與瀏覽器解析的結果別無二致,讓你能夠不再用關心HTML文檔是否能夠被識別,瀏覽器能看,Jumony就能解。正則表達式
完美和強大隻有一步之遙,可是完美的解析器可讓你永遠不用關心HTML源文檔。瀏覽器
如下是Jumony解析器所支持的特性不徹底列表post
特性 | 例子 |
孤立的<解析爲文本 | < a應當解析爲< a |
孤立的>解析爲文本 | <a>></a>應當解析爲<a>></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>元素的解析都還存在問題。網站
僅僅只是完美解析HTML,並不能帶來多少好處,上面已經說過,事實上大部分的HTML文檔,均可以用二流的解析器甚至是簡單的正則表達式加以分析,那麼爲何咱們須要Jumony呢?ui
答案是一個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選擇器是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:
http://demo.jumony.net/help?path=~%2fHelpEntries%2fQuickStart%2f
如你所見,這個網站也是採用Jumony進行驅動的,它會檢索網站下全部的HTML頁面,並抽取頁面的標題以及簡介,造成導航目錄和概要頁面。
爲了照顧沒有Visual Studio的同窗,這裏提供一個壓縮包的下載:
http://files.cnblogs.com/Ivony/JumonyCore.3.0.5.2.zip
但使用Visual Studio開發的最佳實踐是直接使用NuGet管理你全部的程序包。