2013-05-02 55 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