开源阅读内容提取¶
预计阅读时长 : 9 分钟
提取流程¶
Legado 通过配置的对应 url 的网络请求获取到响应内容后,下一步就是通过提取规则提取指定的内容,最终通过 书名
、封面
、目录
等属性将内容展示给用户。
在 Legado 中,元素和属性的提取使用了 JSoup、 JSONPath 两种不同的解析器,同时也支持对纯文本使用正则方式提取内容。
- HTML:JSoup
- JSON:JSONPath
- String:Regex
JSOUP¶
技术框架¶
对于最常见的 HTML 源文本,Legado 使用 JSoup 作为 HTML 解析器,详细说明文档见 jsoup.org ⧉, 还有一个线上测试工具 Try Oline ⧉
选择器语法¶
为了保持通用性,在本教程中我们将使用 CSS 语法 ⧉进行元素选择,使用时必须以 @css:
开头。
属性获取¶
在获取到指定元素后,使用 @
可以获取相应的元素属性 ⧉。
常见元素属性¶
@text
用于获取节点及其所有子节点的全部文本内容,并以集合的形式返回@textNodes
获取节点直接包含的文本节点,并以集合的形式返回@html
获取节点及其所有子元素的 HTML 内容@href
获取节点属性中的链接地址@alt
获取图片节点中的注释内容@src
获取图片节点中的图片地址
自定义元素¶
在获取页面中的各类属性值时,可以重点看一下 <head>
中的代码。例如,腾讯新闻页面中的,可以通过 @css: head > meta[name="Description"]@content
获取到新闻的简介。
示例¶
JSONPath¶
同时,针对可以直接通过 API 以 JSON 格式获取的内容,开源阅读使用 JSONPath 作为 JSON 解析器,使用时请以 @json:
或 $.
开头。
说明文档见 JSONPath - XPath for JSON ⧉, 还有一个线上测试工具 Try Oline ⧉
规则运算符
JSoup 与 JSONPath 支持三种运算符:&&
、||
、%%
。这些运算符只能在同种规则间使用,JSoup 与 JSONPath 之间不能混用。
&&
: 合并所有取到的值||
: 以第一个取到值的为准%%
: 依次取数,如三个列表
- 先取列表1的第一个,再取列表2的第一个,再取列表3的第一个
- 再取列表1的第二个,再取列表2的第二个,……
Regex¶
Regex (正则) 是一种强大的文本处理工具,详细介绍见 正则表达式教程 ⧉。
与前面处理 HTML 和 JSON 这样的结构化数据不同,Regex 适用于处理无结构的文本数据,主要用在提取指定的文本内容,或者替换文本中的指定内容。
Legado 的正则底层是使用的 Java 的 Pattern
类,支持的语法是 Java 的正则语法,然后在配置规则中使用了 :
和 ##
语法糖来实现不同的修饰符效果。
除了源配置之外,正则还在 替换净化
规则中发挥着重要作用,可以以更加灵活的方式实现对文本内容的替换和净化。
AllinOne(提取)¶
- 使用时必须以
:
开头 - 可使用
-:
倒序输出存储匹配结果的数组 - 只能在搜索列表、发现列表、详情页预加载和目录列表中使用,相当于通过正则方式提取对应供下一步使用的原始文本内容
- 提取之后,整体匹配内容和括号指定的分组,将以捕获分组的形式传递,可在下一步规则中通过
$1
、$2
的格式被引用
列表提取 | |
---|---|
OnlyOne(替换)¶
- 使用时必须以
##
开头 - 可以在搜索列表、发现列表、详情页预加载、目录列表之外使用,相对于在获取的属性值原始文本内容中,进行替换操作
- 也支持捕获分组,可以在替换内容中使用
循环替换语法格式为 ##正则表达式##替换内容
,如果要实现无替换内容,相当于实现删除效果,可以直接使用 ##正则表达式
单次替换语法格式为 ##正则表达式##替换内容###
,只获取第一个匹配到的结果并进行替换