首頁  >  文章  >  web前端  >  詳解一個完美的HTML解析引擎(Jumony)

詳解一個完美的HTML解析引擎(Jumony)

零下一度
零下一度原創
2017-05-04 14:57:377327瀏覽

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

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

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

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

特性 例子
孤立的7f19db43d97d2d4008bb10f655c09c49解析为文本 3499910bf9dac5ae3c52d5ede7383485>5db79b134e9f6b82c0b36e0489ee08ed应当解析为3499910bf9dac5ae3c52d5ede7383485>5db79b134e9f6b82c0b36e0489ee08ed
标记属性(没有值的属性) f396c7ee6581b8a2c1feb962c201109c
元素丢失结束标签 e388a4556c0f65e1904146cc1a846bee43091600189d2e5d073500b021ca54e8测试链接94b3e26ee717c64999d7867364b1b4a3
可选结束标签元素
"body", "colgroup", "dd", "dt", "head", "html", "li", "option", "p", "tbody", "td", "tfoot", "th", "thead", "tr"
e388a4556c0f65e1904146cc1a846beeabce388a4556c0f65e1904146cc1a846bee123
无结束标签元素
"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "isindex", "link", "meta" , "param", "wbr", "bgsound", "spacer", "keygen"
4faf7b57895b870867b99beee44351ac
CData元素 #3f1c4e4b6b16bbbd69b2ee476dc4f83aif ( 11027f152cc5b3cb62c2e445c3c9a350d" );2cacc6d41bbb37262a98f745aa00fbf0
#"script", "style", "textarea", "title" # 
預先格式化元素 e03b848252eb9375d56be284e690e873    前面有空格bc5574f69a0cba105bc93bd3dc13c4ec
#屬性值使用單引號 ##0dbfd9bc5d3c7c92cbdc7be3251a6bb2
屬性值使用雙引號 ec88d21db654cc30aafefec4c485de7d
屬性值遺失(但有等號) 2de933bd81cf0e954926b4b4a48640c3
屬性值前面有空格 05797ff6bfecf7b84525904378753179
解析HTML聲明 #8b05045a5be5764f313ed5b9168a17e6
########################################################## ###


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

new JumonyParser().LoadDocument( "www.php.cn/" ).Find( ".post_item a.titlelnk" )

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

二、CSS樣式設定支援

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

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

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

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

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

我們再來看這樣的範例:7cd3a19f7494deb2fc114a1203d0dae994b3e26ee717c64999d7867364b1b4a3,如果我們對這個元素設定padding-left: 0px會怎麼樣?

在Jumony中,結果會是:

<p style="padding-left: 0px; padding-right: 5px; padding-top:5px; padding-bottom: 5px"></p>

看,padding屬性被神奇的自動展開了。

三、CSS 3選擇器支援

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

new JumonyParser().LoadDocument( "www.php.cn/" ).Find( ".post_item a.titlelnk" )

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

 foreach( var title = new JumonyParser().LoadDocument( "www.php.cn/" ).Find( ".post_item a.titlelnk" ) )
  Console.WriteLine( title.InnerText() );

Jumony支援的CSS3選擇器清單:

##p+a選擇相鄰元素p~a選擇後繼元素[attr]屬性存在選擇#[attr=value]屬性值精確匹配##[ attr~=value]#[attr^=value][attr*=value][attr$=value][attr!=value]##: not#:only-child:only-of-type
選擇器 描述
##* 選擇所有元素
#p a 選擇子代元素
p>a #選擇子級元素
屬性值近似匹配
屬性值開頭符合
屬性值包含匹配
屬性值結尾符合
屬性值否定符合
否定偽類別
唯一子元素偽類別
##唯一型別偽類別 :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強大的可擴充性,從而發揮強大的功能。

【相關推薦】

1. 免費html線上影片教學

2. html開發手冊

3. php.cn原始html5影片教學

以上是詳解一個完美的HTML解析引擎(Jumony)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn