看懂《书源规则:从入门到入土》(3)规则入门



前言:在上一章中 ,我们终于看到了网站的html代码。在本章中,我们需要开始通过“规则”,从我们得到的代码里获取我们需要的内容。

我知道上一章肯定没多少人看,毕竟那么水,没玩梗,还没有妹子 受虐滑稽 。没关系,这章在写到必须的部分认真写的。



本章可能需要的工具:

0:最好有台电脑,配置不用太好,能上网就行 受虐滑稽

1:还是浏览器(要能开控制台)

2:阅读/阅读pro app 3.x版本

3:应该不需要翻译工具了吧 受虐滑稽



免责声明:

该系列(看懂《书源规则:从入门到入土》)图文仅供学习使用,自行编写的规则所造成的后果请自行承担,本人概不负责。

----------

首先,阅读app提供了jsoup , jsonpath , xpath三种解析器用于对html进行解析。(但我看了不少书源好像比较喜欢用jsoup写规则,所以选题图的时候就...... 受虐滑稽 )。

废话不说了,开篇

通过之前两篇图文,我们解决了“搜索地址”的问题。

接下来,我们需要知道下面那一堆项目应该怎么写。

(注意:为减轻大家的大脑负担,我只挑重要的写。“发现”功能并非必须因此我不会去写)

还是那张老图

大家应该一眼就能看懂什么叫书籍列表吧

图中包含封面、书名、作者、分类这样一个小块块就是列表中的一个项目,一堆项目摆在一起排成列就组成了一个列表。现在我们要怎么样让app读取到这里所有的小块块呢?

现在,打开浏览器控制台

还是老图

通过鼠标选取元素我们可以看到小块块们都是一个个<div class="block">标签。列表有很多种写法,咋们暂时先不管div标签是干嘛的,反正现在他的作用就是装着小块块里的内容 受虐滑稽

这个div标签带了一个叫class的属性 ,这个属性的作用是定义这个标签的类名(class name);所以现在,这个标签他有了一个类名叫block。

注:类似的属性还有:

id:定义标签的id,标签的id属性值在整个文档里必须唯一,所有标签都可以设置该属性。

name:定义标签的名称,标签的name属性值可以重复,仅部分标签可设置该属性。



阅读的jsoup default规则分为三段,每段间通过"."(英文句号)分隔规则后可用"@"把结果交给下一段规则继续处理。(jsoup选择器的文档具体可以看这个 查看链接 )

规则的三段分别是类型、名称,位置。

类型表示将按照什么作为查找依据,支持class(类名)、id(标签id)、tag(标签名)、text(标签文本,较少用)、children(所有子标签)等。一般来说class , id , tag会比较常用(言下之意,我只讲这三个 受虐滑稽 ,一般也够用了)。

名称自然就要查找的类名、id、标签名、文本了 受虐滑稽

位置就是如果跟据前两段找到了多个标签,那么应该选哪一个(位置从0开始)。不写的话表示选择所有,负数表示从后向前数(从-1开始)。也可以在第二段后用[开始位置:结束位置]的方法选择一段范围内的标签,范围选择是包含开始位置和结束位置的!请注意!

看不懂?举个例子吧,假如现在有一个这样的列表

<div class="items">a</div>

<div id="zero">零</div>

<div class="items" id="one">1</div>

<div class="items" id="two">2</div>

<div class="items" id="three">3</div>

<div class="items" id="four">4</div>

<div class="items" id="five">5</div>

<div>六</div>

如果我要选择3所在的标签(<div class="items" id="three">3</div>),那么应该怎么写?

当然,最省事的写法是id.three.0 受虐滑稽 (id具有唯一性,所以理论上id.three也行,但就怕一些开发者不规范 喝酒 )。但很多时候没有id来给你找

这时,可以用标签名和类名。比如说

标签名:tag.div.4或者tag.div.-4

类名:class.items.3或者class.items.-3

注意:如果某个标签的类名出现类似于

class="xxx yyy"

这种写法的表示这个标签同时属于xxx和yyy这两个类,而不是"xxx yyy"这个类!

比如说有一个标签

<div class="blockone blocktwo"></div>

那么用class.blockone和class.blocktwo都能抓取到,但class.blockone blocktwo就不行 受虐滑稽



看懂了吗?那么,上面网站的书源列表规则该怎么写?

首先,我们看到书籍列表是不是写在一个类名是"read_book"的div标签里的,书的信息放在这个标签里的类名是"block"的div标签里。(专业点的说法是类名block的div标签是类名read_book的div标签的子标签。请注意,标签里的所有标签都是它的子标签。比如block里的标签也属于read_book的子标签,所以请谨慎使用针对所有子标签的操作!!!)

所以,用规则class.read_book.0@class.block就能获取书籍列表了。



温馨提示:在上一步获取到书籍列表后。结果会传递给下面的书名、作者、分类、字数、最新章节、简介、封面、详情页(除了详情是必须;其它有的话能写尽量写,不然搜索的时候够呛)。所以针对上面的每一个结果再写规则即可。

示例:那个被展开的标签就是上面的书籍列表里找到的其中一本书,那么怎么挑出我们需要的东西呢?

为了方便表述,咱们先约定一下标签的表述方式:

直接写名称表示标签名,比如div表示div标签;

"."+名称 表示类名,比如.search表示类名是search的标签;

"#"+名称 表示id,比如#book表示id是book的标签;

这个也是在css标签选择器中的表示方法。



图中可见,书名写在.block -> .block_txt -> h2 -> a里面,在上一步中,我们已经获取到.block了,所以这一步只要class.block_txt.0@tag.h2.0@tag.a.0就能定位到书名所在的a标签了。但此时,还读不出书名 受虐滑稽

还记得上一章曾经说过,标签里的文本也是一个节点,叫文本节点吗?文本节点通过textNodes获取,所以,这里的规则应该是class.block_txt.0@tag.h2.0@tag.a.0@textNodes

同理,作者和分类规则写法差不多不再赘述(至于怎么把“作者:”三个字干掉。先挖个坑,和下章正则表达式一起讲 受虐滑稽 )



书名、作者、分类已经找到了,现在看看上面的小块块里还有什么没读出来的。封面?嗯,那怎么读?

有点基础的酷友应该知道了,图片嘛,不就是img标签吗,通过src属性指定图片的链接。class.block_img.0@tag.a.0@tag.img.0@src搞定 哈哈哈

嗯,搞定了 受虐滑稽 。继续,重头戏来了,需要读出详情页的链接交给下一步“详情”来处理。

那么怎么找这个链接呢?首先,我们在网页上操作的时候会发现,点击“完美世界之无上仙帝”这几个字的时候就会跳转到这本书的详情页。所以,这个文本节点的父节点应该是个a标签(a标签用于制作点击链接)。看看代码,好像的确是这样 受虐滑稽 所以class.block_txt.0@tag.h2.0@tag.a.0这样就找到了;

a标签通过href属性指定点击后跳转的链接,所以class.block_txt.0@tag.h2.0@tag.a.0@href 这样就拿到了详情页路径了 。

---------

下面开始提升难度,我不会再提供现成的作业大家抄了。要自己写了!

详情规则页面同理,书名、作者、分类、字数、最新章节、简介、封面根据情况自己写,如果之前在解析搜索的时候有的这里对应的规则就可以不写了。以上部分非必须。

像这种目录在详情页的,甚至连目录页url也可以不写 受虐滑稽 ,不写的话详情页会直接进入目录处理流程。请注意:目录页url只接受一个URL,编写的时候请确保规则不会抓取到多个URL!

目录列表和上面书籍列表一样原来,抓每个章节对应的小块块 受虐滑稽 ,比如说这里的一堆li。具体规则怎么写自己去悟 t耐克嘴

抓到列表里的项目后就可以以这个为基础写章节名称和章节URL规则了。不会写滚上去看怎么获取文本和链接 t耐克嘴

像这种分页目录的 ,我们就需要用到“目录下一页”规则了。

获取目录下一页的链接然后继续解析 哈哈哈

获取到章节URL后进入正文处理流程

现在,我们看到,正文是写在p标签里的。那么怎么获得所有这些写了正文的p标签呢?

还记得之前说过不写位置会抓取所有符合条件的标签吗?所以class.nr_nr.0@class.txt.0@tag.p@textNodes完事 无语

上面大家也看到了,章节有分页 。那怎么获取“正文下一页URL”呢?

温馨提示:不用太担心程序一直瞎点下一页,如果下一页的链接是之前获取到的某章链接程序会认为本章结束了 受虐滑稽

------------

结语&真心话&预告:

快乐的时候总是过得很快,这章又写完了 受虐滑稽 。虽然只是介绍了常用的jsoup规则 ,但原理上的东西似乎也说完了 受虐滑稽

俗话说:“师傅带进门,修行看个人”。如果你能理解html的结构,什么叫父节点/子节点(我上面有解释),什么叫同级节点(自己去查!),什么是节点属性(上面/前篇有提及)......,那么对于你来说jsonpath和xpath规则都不难。后面开始逐步转向高阶内容了,小白要开始成长了,我会尽力解释得浅显易懂,但如果完全没基础的话估计看起来够呛。

至少赏我几分薄面把前两篇和本篇看懂吧 无语 ,如果能看懂,有一颗肯实践的心,一些简单网站的源你是应该能写出来了。

敬请期待下一章:正则(正则表达式)入门

下章涉及的内容会比较复杂(相比1-3章),所以时间会长点,请耐心等待