2013-05-02 2 views
1

J'essaie de faire en sorte que mon programme vérifie le retour d'une expression xpath et si elle est nulle, elle devrait en essayer une autre, comment faire? J'ai essayé tous les exemples sur le site Web et les guillemets simples vierges ne compileront pas.Webharvest If et null test

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

Existe-t-il un moyen de manipuler une variable définie pour exclure certaines parties de chaînes comme des symboles et des nombres?

Répondre

0

Vous pouvez utiliser normalize-space (.)! = '' Au lieu de $ {googleResults! = Null}. Pour manipuler une variable définie afin d'exclure certaines parties de chaînes comme les symboles et les nombres, utilisez starts-with() ends-with() matches(), contains() l'un d'entre eux selon vos besoins et le support webharvest.

Prenons un exemple pour vérifier <b>dfsdffsnavindfds</b> élément:

  1. /b [starts-with (texte(), 'd')] - pour savoir si elle est a caractère à partir 'd'
  2. /b [ends-with (text(), 's')] - pour le savoir s'il a un caractère de début 's'
  3. /b [contains (text(), 'navin')] - pour savoir si elle a une chaîne 'navin'

Pour plus d'informations, regardez http://www.w3schools.com/xpath/xpath_functions.asp

+0

Comment pourrais-je utiliser dans le code lui-même? Pardonnez-moi, je suis très nouveau pour XML et WebHarvest. – user2330657

+0

J'ai mis à jour ma réponse pour plusmore. S'il vous plaît jeter un oeil –

1

J'ai trouvé le même problème que vous, où l'exemple du official WH user manual ne fonctionne pas, à cause des doubles guillemets simples.

comme une œuvre autour J'utilise: variable.toString().length() > 0

et voici votre code:

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

En outre, quelques notes sur votre code en général:

1) En fait, télécharger la page est la partie la plus gourmande en temps et en mémoire de la récolte en ligne. Si les informations que vous souhaitez ne sont pas collectées par le premier xpath, vous finissez par télécharger à nouveau la page (en relançant la requête http). sauvegardez le résultat de la requête http dans une variable et vous pourrez ensuite réinterroger le résultat, sans répéter le téléchargement - ceci limite également le nombre de fois que vous frappez le serveur source, ce qui devient un problème si vous avez plusieurs pages à gratter.

<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) vous pouvez éviter toute condition en changeant la 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

Merci! Vous m'avez aidé avec un problème que j'avais avec la fonction 'if' de webharvest. La syntaxe '' a fonctionné magnifiquement pour moi. – Jangari