Web收获if / else和try / catch总是成功

时间:2014-07-17 02:12:09

标签: xpath webharvest

我正在开展一个项目,我需要从网站上收集一些数据,所以我使用了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,我会非常感激!

1 个答案:

答案 0 :(得分:1)

找到答案。

This personif存在类似的问题,并且使用语法提示答案: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>
[...]                   

产生了正确的结果。