我正在尝试让我的程序检查xpath表达式的返回,如果它是null,它应该尝试不同的,我该怎么做?我已经尝试了网站上的所有示例,空白的单引号将无法编译。
<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 != null}">
<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>
还有什么方法可以操纵定义的变量来排除字符串的某些部分,如符号和数字?
答案 0 :(得分:1)
我发现了和你一样的问题,official WH user manual中的例子不起作用,因为双引号。
作为我的工作: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>
答案 1 :(得分:0)
您可以使用normalize-space(。)!=''代替$ {googleResults!= null}。
要操纵定义的变量以排除字符串的某些部分,如符号和数字,请使用starts-with()ends-with()matches(),contains()根据您的需要和webharvest支持中的任何一个。
举例来检查<b>dfsdffsnavindfds</b>
元素:
有关详细信息,请查看http://www.w3schools.com/xpath/xpath_functions.asp