我发现了与您相同的问题,由于双单引号, WH 官方用户手册中的示例不起作用。
作为一种解决方法,我使用:variable.toString().length() > 0
这是你的代码:
<var-def name="googleResults">
<xpath expression="//div[@id='center_col']//div[@id='search']//div[@id='ires']//ol/li/div//b/div/text()">
<html-to-xml>
<http url="http://google.com/shopping?q=asus laptops&hl=en"/>
</html-to-xml>
</xpath>
</var-def>
<var-def name="productTruth">
<case>
<if condition="${googleResults.toString().length() > 0}">
<var name="googleResults"/>
</if>
<else>
<xpath expression="//div[@id='center_col']//div[@id='search']//div[@id='ires']//ol/li/div//b/text()">
<html-to-xml>
<http url="http://google.com/shopping?q=asus laptops&hl=en"/>
</html-to-xml>
</xpath>
</else>
</case>
</var-def>
此外,一般对您的代码有一些注意事项:
1)实际下载页面是网络收获中最耗时耗内存的部分。如果第一个 xpath 没有收集到您想要的信息,您最终会重新下载页面(重新运行 http 请求)。将 http 请求的结果保存在变量中,然后您可以重新查询结果,而无需重复下载 - 这也限制了您访问源服务器的次数,如果您要抓取多个页面,这将成为一个问题。
<var-def name="pagetext">
<html-to-xml>
<http url="http://google.com/shopping?q=asus laptops&hl=en"/>
</html-to-xml>
</var-def>
<var-def name="googleResults">
<xpath expression="//div[@id='center_col']//div[@id='search']//div[@id='ires']//ol/li/div//b/div/text()">
<var name="pagetext"/>
</xpath>
</var-def>
<var-def name="productTruth">
<case>
<if condition="${googleResults.toString().length() > 0}">
<var name="googleResults"/>
</if>
<else>
<xpath expression="//div[@id='center_col']//div[@id='search']//div[@id='ires']//ol/li/div//b/text()">
<var name="pagetext"/>
</xpath>
</else>
</case>
</var-def>
2)您可以通过更改xpath来避免整个条件:
//div[@id='center_col']//div[@id='search']//div[@id='ires']//ol/li/div//b/descendant-or-self::text()
<var-def name="pagetext">
<html-to-xml>
<http url="http://google.com/shopping?q=asus laptops&hl=en"/>
</html-to-xml>
</var-def>
<var-def name="googleResults">
<xpath expression="//div[@id='center_col']//div[@id='search']//div[@id='ires']//ol/li/div//b/descendant-or-self::text()">
<var name="pagetext"/>
</xpath>
</var-def>