1

我试图让我的程序检查 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>

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

4

2 回答 2

1

我发现了与您相同的问题,由于双单引号, 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&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>
于 2014-07-15T09:12:15.430 回答
0

您可以使用 normalize-space(.) != '' 而不是 ${googleResults != null}。

要操作定义的变量以排除字符串的某些部分,如符号和数字,请根据您的需要和 webharvest 支持使用starts-with() ends-with() 匹配()、包含() 其中任何一个。

<b>dfsdffsnavindfds</b>以检查元素为例:

  1. /b[starts-with(text(), 'd')] -- 判断它是否有起始字符 'd'
  2. /b[ends-with(text(), 's')] - 找出它是否有起始字符's'
  3. /b[contains(text(), 'navin')] -- 判断它是否有字符串'navin'

有关更多信息,请查看http://www.w3schools.com/xpath/xpath_functions.asp

于 2013-05-02T06:49:31.950 回答