Skip to content

Example of JavaScript instruction for the current iteration in a conditional statement

Naibo Wang edited this page Jun 7, 2023 · 6 revisions

判断条件中针对当前循环项的JavaScript指令示例。

中国地震台网表格案例

如下图,如要采集表格中第五项深度字段包含“10”的条目,需要在循环中添加判断条件,并将条件设置为如下命令:

return document.evaluate("./td[5]", arguments[0], null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerText.indexOf("10") >= 0

原理:循环的XPATH为:/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr,即循环检索表格中的每一行,如果条件判断简单设置为“当前循环项包含文本10”,那么不管是表格这一行的哪一项包含10都会提取当前行数据,不符合我们“只想采集当第五项’深度’字段包含10的行数据”的需求,因此需要写上面的命令。

命令中的./td[5]是相对当前行/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr内部的第5个td元素,即深度字段的值,arguments[0]表示当前行元素,.singleNodeValue为取结果的第一个Node节点,后面的innerText为元素文本,indexOf为字符串查找指令。

名录产品检索案例

https://emagecompany.com/search.php?key=%E5%8D%8F%E4%BC%9A&page=1&total=360

示例任务json文件在这里: https://github.com/NaiboWang/EasySpider/blob/master/Examples/JS%E5%88%A4%E6%96%AD%E6%9D%A1%E4%BB%B6%E7%A4%BA%E4%BE%8B.json

按照正常流程选中所有名单的<a>标签然后点击“循环点击每个链接”选项,定义完提取详情页操作后,把点击元素和提取数据的操作放入条件判断中,再设置判断条件为“基于当前循环项的JavaScript命令返回值”:

image

命令为:

return arguments[0].nextSibling.nextSibling.innerText.includes("免费资源")

解释:

先点开F12审查元素,发现任意链接<a>标签结构为:

image

即“免费资源”的字段在<font>标签内,与当前<a>标签是兄弟元素,即同级元素。则我们可以使用nextSibling属性来获取相对当前元素arguments[0],即<a>标签的下一个兄弟节点。由于在示例中,<br>标签是<a>标签的下一个兄弟节点,而我们需要的是下一个<font>标签,所以我们可以使用nextSibling属性两次来跳过<br>标签和空的<td>标签,然后获取到<font>标签。

然后,我们可以使用innerText属性获取<font>标签中的文本内容,并使用includes方法检查是否包含字符串"免费资源"。

即实现了只点开“免费资源”的链接并采集内容的需求。