2013-05-02 32 views
1

我想让我的程序检查xpath表达式的返回,如果它为空,它应该尝试不同的一个,我该怎么做?我已经尝试了网站上的所有例子,空白的单引号不会被编译。Webharvest如果和空测试

<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> 

还有什么办法来操纵定义的变量来排除像符号和数字字符串的某些部分?

回答

0

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

要操纵定义的变量以排除字符串的某些部分(如符号和数字),请根据需要和webharvest支持使用starts()结尾符合()匹配(),包含()其中任意一个。

以一个例子来检查<b>dfsdffsnavindfds</b>元件:

  1. /B [开始-与(文本(), 'd')] - 找出如果它是已经开始字符 'd'
  2. /b [ends-with(text(),'s')] - 找出它是否有起始字符'''
  3. /b [contains(text(),'navin')]找出是否有字符串'navin'

欲了解更多信息,请看http://www.w3schools.com/xpath/xpath_functions.asp

+0

我怎么会在代码本身使用这些?原谅我,我对XML和WebHarvest很陌生。 – user2330657 2013-05-02 07:58:02

+0

我已经更新了我的答案。请看看 – 2013-05-02 08:57:10

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> 
+0

谢谢!你帮我解决了一个我正在使用webharvest的if函数的问题。语法' 0}”>'对我来说工作得很好。 – Jangari 2014-07-17 03:41:48