等等 发表于 2025-3-13 17:44:38

分卷(volume标识)规则的写法

本帖最后由 等等 于 2025-3-14 18:33 编辑

以下个人理解,欢迎探讨。

一、什么是分卷
我们平时阅读时,会遇到作者或网站给章节分卷的情况,比如下图,红线部分即为分卷卷名:

在阅读app里,分卷是一种特殊的章节,如果写了分卷规则,目录就会以灰色背景显示卷名,如下图:


除了还原原网站排版,也可以用于展示某些被网站隐藏地址的目录
比如 https://ysqbbs.com/forum.php?mod=viewthread&tid=23640 这个帖子提到的网站 https://www.fd80s.com,用一般方法写成书源时,因为缺少章节url,第六、第十一章是不会显示在目录里的:


二、分卷的特点
①与普通章节一样,需要从目录列表中获取,需要有对应的章节名称
②与普通章节不同,分卷对应的章节URL需要为空(result=""),如果不为空,则需要用js处理一下,使获取结果为空
③与普通章节不同,volume规则获取到的结果为 true 或其他非空值。如果volume规则结果为 flase 或 "" ,判断为普通章节

三、分卷规则的写法
①当目录列表类型为elements(包括用 default写法、jsoup.select、java.getElements等方式获得的列表)

先确保目录列表获取到卷名位置。

以 https://hellowland.com/w/book/5627970 这本书为例,如果不写分卷,目录规则只需要包含上图的蓝框部分,即:
.px-4 a
写分卷,那么目录规则需要包含红框部分:
.accordion-button,.px-4 a


章节名称规则也需要兼顾红框和蓝框:
.mb-2@@text||text

章节URL规则只需要包含蓝框,因为红框部分 href 已经为空,所以填:
href
又因为原网站不会自动补全网址,所以补充章节URL规则为
href
@js:
result!==""?https://hellowland.com/"+result:""

原网站仅分卷有aria-expanded属性,且值为"true",普通章节没有,故volume规则可直接填:
aria-expanded
如果没有这么方便的属性,那就自己写个判断,比如:
href@js:result==""?true:false
这行代码的意思是:获取 href 的值,当值为空时,返回 true ,否则返回 false
(前面知识点:volume规则的值为true时判断该章节为分卷)

如果是普通章节,没获取到url的情况下,调试会显示“目录x未获取到url,使用baseUrl替代”
写了volume规则后,调试时遇到分卷,则会显示“一级目录x未获取到url,使用标题替代”:


最终规则和效果:



②当目录列表类型为NativeArray数组
直接写进list.push即可,如图:


注意:

当目录列表类型为NativeArray、填写了volume规则,且正文下一页是类似“text.下一@href”的形式时,碰到分卷,正文下一页不会在遇到目录已有章节时停止,而是会一直获取到全书章节结束。

解决方案:
手搓正文下一页判断条件。比如在目录页java.put章节列表,正文下一页规则中java.get,再用includes()判断获取到的下一页链接是否在章节列表中


jin1987 发表于 2025-3-13 17:49:22

感谢分享,学习一下

cm的宝马 发表于 2025-3-13 17:50:57

感谢讲解

观者 发表于 2025-3-13 17:52:11

感谢分享

读者202411 发表于 2025-3-13 17:57:04

感谢

苏打水 发表于 2025-3-13 18:01:47

感谢教学

Sylt1122 发表于 2025-3-13 18:03:00

一点都看不懂。只能点个赞支持下了👍🏻

奥德赛 发表于 2025-3-13 18:27:19

感谢分享,虽然看不懂

壬二酸 发表于 2025-3-13 18:43:13

原来是这样啊。长知识了

慌绿龙虾 发表于 2025-3-13 19:18:47

感谢分享
页: [1] 2 3
查看完整版本: 分卷(volume标识)规则的写法