jsoup获得css,jsoup代码解读之五-凯发k8官方网
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的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: