也許很多人會認為,目前的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元素的解析都還存在問題。
只是完美解析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選擇器是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 | #選擇子級元素 |
選擇相鄰元素 | |
選擇後繼元素 | |
屬性存在選擇 | |
屬性值精確匹配 | |
屬性值近似匹配 | |
屬性值開頭符合 | |
屬性值包含匹配 | |
屬性值結尾符合 | |
屬性值否定符合 | ##: 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強大的可擴充性,從而發揮強大的功能。
【相關推薦】
2. html開發手冊
以上是詳解一個完美的HTML解析引擎(Jumony)的詳細內容。更多資訊請關注PHP中文網其他相關文章!