1

我正在做一个需要从网站收集一些数据的项目,所以我正在使用 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似乎返回 true,并运行它的主体。

我可以更容易地看到为什么try/catch不能正常工作,因为 xpath 不返回任何值(如果第二页不存在)不会构成“错误”,因此尝试仍然会成功。另一个困难是下一页链接的@href 是相对的,因此需要附加到第一页的URL(或文章的基本URL,实际上,但这里相同),这意味着我的html -to-xml 采用 url ${firstPage}${secondPageLink},它最终只是再次成为第一页 URL,因此 webharvest 第二次处理第一页。

如果有人可以重新制定我的if测试以在 secondPageLink xpath 返回空值时返回 false,我将非常感激!

4

1 回答 1

1

找到了答案。

这个人对 有类似的问题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>
[...]                   

产生了正确的结果。

于 2014-07-17T03:40:31.200 回答