Webharvest If和null测试

时间:2013-05-02 06:28:23

标签: xml xpath webharvest

我正在尝试让我的程序检查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&amp;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&amp;hl=en"/>
                </html-to-xml>
            </xpath>
        </else>
    </case>
</var-def>

还有什么方法可以操纵定义的变量来排除字符串的某些部分,如符号和数字?

2 个答案:

答案 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&amp;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&amp;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&amp;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&amp;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>元素:

  1. / b [starts-with(text(),'d')] - 找出它是否有起始字符'd'
  2. / b [ends-with(text(),'s')] - 找出它是否有起始字符的'
  3. / b [contains(text(),'navin')] - 找出它是否有字符串'navin'
  4. 有关详细信息,请查看http://www.w3schools.com/xpath/xpath_functions.asp