欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > css >内容正文

css

jsoup获得css,jsoup代码解读之五-凯发k8官方网

发布时间:2024/10/8 css 0 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 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: 使用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年技术见证,附赠技术全景图

总结

以上是凯发k8官方网为你收集整理的jsoup获得css,jsoup代码解读之五-实现一个css selector的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图