jsoup获得css,Jsoup代码解读之五-实现一个CSS Selector
Jsoup代碼解讀之七-實現一個CSS Selector
當當當!終于來到了Jsoup的特色:CSS Selector部分。selector也是我寫的爬蟲框架webmagic開發的一個重點。附上一張street fighter的圖,希望以后webmagic也能挑戰Jsoup!
select機制
Jsoup的select包里,類結構如下:
在最開始介紹Jsoup的時候,就已經說過NodeVisitor和Selector了。Selector是select部分的對外facade,而NodeVisitor則是遍歷樹的底層API,CSS Selector也是根據NodeVisitor實現的遍歷。
Jsoup的select核心是Evaluator。Selector所傳遞的表達式,會經過QueryParser,最終編譯成一個Evaluator。Evaluator是一個抽象類,它只有一個方法:
public abstract boolean matches(Element root, Element element);
注意這里傳入了root,是為了某些情況下對樹進行遍歷時用的。
Evaluator的設計簡潔明了,所有的Selector表達式單詞都會編譯到對應的Evaluator。例如#xx對應Id,.xx對應Class,[]對應Attribute。這里補充一下w3c的CSS Selector規范:http://www.w3.org/TR/CSS2/selector.html
當然,只靠這幾個還不夠,Jsoup還定義了CombiningEvaluator(對Evaluator進行And/Or組合),StructuralEvaluator(結合DOM樹結構進行篩選)。
這里我們可能最關心的是,“div ul li”這樣的父子結構是如何實現的。這個的實現方式在StructuralEvaluator.Parent中,貼一下代碼了:
static class Parent extends StructuralEvaluator {
public Parent(Evaluator evaluator) {
this.evaluator = evaluator;
}
public boolean matches(Element root, Element element) {
if (root == element)
return false;
Element parent = element.parent();
while (parent != root) {
if (evaluator.matches(root, parent))
return true;
parent = parent.parent();
}
return false;
}
}
這里Parent包含了一個evaluator屬性,會根據這個evaluator去驗證所有父節點。注意Parent是可以嵌套的,所以這個表達式"div ul li"最終會編譯成And(Parent(And(Parent(Tag("div")),Tag("ul")),Tag("li")))這樣的Evaluator組合。
select部分比想象的要簡單,代碼可讀性也很高。經過了parser部分的研究,這部分應該算是駕輕就熟了。
關于webmagic的后續打算
webmagic是一個爬蟲框架,它的Selector是用于抓取HTML中指定的文本,其機制和Jsoup的Evaluator非常像,只不過webmagic暫時是將Selector封裝成較簡單的API,而Evaluator直接上了表達式。之前也考慮過自己定制DSL來寫一個HTML,現在看了Jsoup的源碼,實現能力算是有了,但是引入DSL,實現只是一小部分,如何讓DSL易寫易懂才是難點。
其實看了Jsoup的源碼,精細程度上比webmagic要好得多了,基本每個類都對應一個真實的概念抽象,可能以后會在這方面下點工夫。
Jsoup代碼解讀之一-概述
Jsoup代碼解讀之一-概述 今天看到一個用python寫的抽取正文的東東,美滋滋的用Java實現了一番,放到了webmagic里,然后發現Jsoup里已經有了…覺得自己各種不靠譜啊!算了,靜下心來學 ...
Jsoup代碼解讀之二-DOM相關對象
Jsoup代碼解讀之二-DOM相關對象 ? 之前在文章中說到,Jsoup使用了一套自己的DOM對象體系,和Java XML API互不兼容.這樣做的好處是從XML的API里解脫出來,使得代碼精煉了很多 ...
Jsoup代碼解讀之六-防御XSS攻擊
Jsoup代碼解讀之八-防御XSS攻擊 防御XSS攻擊的一般原理 cleaner是Jsoup的重要功能之一,我們常用它來進行富文本輸入中的XSS防御. 我們知道,XSS攻擊的一般方式是,通過在頁面輸入 ...
Jsoup代碼解讀之四-parser
Jsoup代碼解讀之四-parser 作為Java世界最好的HTML 解析庫,Jsoup的parser實現非常具有代表性.這部分也是Jsoup最復雜的部分,需要一些數據結構.狀態機乃至編譯器的知識.好 ...
Jsoup代碼解讀之三-Document的輸出
Jsoup代碼解讀之三-Document的輸出 ? Jsoup官方說明里,一個重要的功能就是output tidy HTML.這里我們看看Jsoup是如何輸出HTML的. HTML相關知識 分析代碼前 ...
如何判斷一個DOM元素正在動畫,一個CSS“阻塞”JS的例子
一般情況下CSS不會直接影響JS的程序邏輯,但是以CSS實現動畫的話,這個便不太確定了,這個故事發生在與UED遷移全局樣式的過程. 曾經我有一段實現彈出層隱藏動畫的代碼是這個樣子的: if (this ...
轉:Selenium之CSS Selector定位詳解
CSS selector定位 CSS(Cascading Style Sheets)是一種語言,它被用來描述 HTML 和 XML 文檔的樣式.? 百度輸入框:
css selector
文章一:?http://www.jb51.net/css/68287.html 去年我學jQuery的時候,曾經做過一點選擇器(selector)的筆記,今天是CSS的選擇器,以后還有一部分xPath ...
Xpath 和Css Selector使用
Xpath是xml的路徑語言,就是通過元素的路徑來查找標簽元素. Xpath直接在火狐瀏覽器的firebug中練習,49版本一下的火狐才能用firebug插件. Xpath的使用方法 注://*? ? ...
隨機推薦
css樣式注意
CSS3 font-face定義的字體使用時有時候用引號,有時候不用,很奇怪,如 @font-face{ font-family: Roboto-Black; src: url('../package ...
通過內省機制設置JavaBean
一.步驟: 1)使用PropertyDescriptor類獲取屬性描述者對象 //pd引用Student的name屬性 PropertyDescriptor pd = new PropertyDesc ...
網易云課堂_C++程序設計入門(上)_第4單元:物以類聚 – 對象和類_第4單元作業【3】- 在線編程(難度:難)
1 在本單元作業[1]和作業[2]的基礎上,創建一個MyRectangle類,并在main函數中創建類的實例.(10分) 題目難度: 難 題目內容: Screen類: 與作業[2]要求完全相同. 如果 ...
WGS84、GCJ-02(火星坐標)、百度坐標,Web墨卡托坐標
GCJ-02坐標系統(火星坐標)簡介:http://blog.csdn.net/giswens/article/details/8775121(存檔:http://mapbd.com/cms/2012 ...
Videojs視頻插件在React中的應用
1.介紹video.js視頻插件 1.1 簡單介紹 Video.js是一個通用的在網頁上嵌入視頻播放器的JS庫,支持電腦端和移動端.Video.js自動檢測瀏覽器對Html5的支持情況,如果不支持Ht ...
Servlet學習應該注意的幾點
一.Servlet生命周期(即運行過程) (1)初始階段,調用init()方法 (2)響應客戶請求階段,調用service()方法.由service()方法根據提交方式不同執行doGet()或doPo ...
poj 3764 The xor-longest Path (01 Trie)
鏈接:http://poj.org/problem?id=3764 題面: The xor-longest Path Time Limit:?2000MS ? Memory Limit:?65536K ...
SQL 查找重復記錄
CREATE TABLE product(?ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,?Pid INT NOT NULL,?Pname VARCHAR(50) ...
Python 關于數組矩陣變換函數numpy.nonzero(),numpy.multiply()用法
1.numpy.nonzero(condition),返回參數condition(為數組或者矩陣)中非0元素的索引所形成的ndarray數組,同時也可以返回condition中布爾值為True的值索引 ...
JS形參與實參問題
JavaScript的參數傳遞也都是采用值傳遞的方式進行傳值. (1)? ? ?通過實參調用函數的時候,傳入函數里的是實參的副本而不是實參,因此在函數里面修改參數值并不會對實參造成影響. 例如:將全局 ...
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的jsoup获得css,Jsoup代码解读之五-实现一个CSS Selector的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西部服务器怎么备份文件,怎么将云服务器数
- 下一篇: css3 渐变色 3种,css3实现渐变