我正在开展一个项目,我需要从网站上收集一些数据,所以我使用了webharvest。
我遇到了一个问题,即我收集的数据(来自新闻网站的评论)有时会跨越多个页面。我试图将其配置为在网页的xpath中查找指向第二页注释的链接。问题是,如果我尝试if
测试,条件总是通过,如果我尝试try
语句,try
正文总是成功。这导致我的脚本从第一页(如果只有一个)中提取注释两次。但是,有两套评论的文章很有效。所以我的问题涉及if
条件和try
语句的语法。关于这些功能,关于Webharvest的文档很少。
这是我尝试的内容。首先,if
测试:
<var-def name="secondPageLink">
<xpath expression="/a[@class='next']/@href">
<var name="firstPage"/>
</xpath>
</var-def>
<case>
<if condition="${secondPageLink != null}">
[ process second page ]
</if>
</case>
其次,try
/ catch
:
<try>
<body>
<var-def name="secondPageLink">
<xpath expression="/a[@class='next']/@href">
<var name="firstPage"/>
</xpath>
</var-def>
[ continue to process page ]
</body>
<catch>
</catch>
</try>
if
测试的问题在于,尽管当没有第二页存在时该变量为空(我可以从gui中的调试中看到),if
似乎返回是的,并且运行它的身体。
我可以更轻松地了解为什么try
/ catch
无法正常工作,因为xpath不返回任何值(如果第二页不存在)将不会#39 ; t构成错误&#39;因此,尝试仍然会成功。另一个困难是下一页链接的@href是相对的,因此需要附加到第一页的URL(或文章的基本URL,实际上,但在这里相同),这意味着我的html -to-xml获取url $ {firstPage} $ {secondPageLink},它最终只是第一个页面URL,因此webharvest再次处理第一页。
如果有人可以重构我的if
测试,以便在secondPageLink xpath返回空值时返回false,我会非常感激!
答案 0 :(得分:1)
找到答案。
This person与if
存在类似的问题,并且使用语法提示答案:condition="${variable.toString().length() > 0}"
。
因此,在我的代码中,将if
测试替换为:
<case>
<if condition="${secondPageLink.toString().length() > 0}">
<var-def name="secondPageFull">
<html-to-xml>
<http url="${commentedArticleURL}${secondPageLink}"/>
</html-to-xml>
[...]
产生了正确的结果。