日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > CSS >内容正文

CSS

jsoup获得css,Jsoup代码解读之五-实现一个CSS Selector

發布時間:2024/10/8 CSS 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。