2014-07-17 1 views
1

Je travaille sur un projet où j'ai besoin de récolter des données sur le site web, donc j'utilise webharvest.Webharvest if/else et try/catch toujours réussi

Je suis confronté à un problème où les données que je récolte (commentaires des sites d'informations) se trouvent parfois sur plus d'une page. J'essaye de le configurer pour rechercher le lien vers la deuxième page des commentaires dans le xpath de la page Web. Le problème est que si j'essaie un test if, la condition passe toujours, et si j'essaie une instruction try, le corps try réussit toujours. Il en résulte que mon script extrait les commentaires de la première page (s'il n'y en a qu'un), deux fois. Les articles avec deux séries de commentaires fonctionnent à merveille, cependant. Donc, ma question concerne la syntaxe de if conditions et try déclarations. La documentation sur Webharvest est limitée en ce qui concerne ces fonctions.

Voici ce que j'essaie. Tout d'abord, le if test:

<var-def name="secondPageLink"> 
    <xpath expression="/a[@class='next']/@href"> 
     <var name="firstPage"/> 
    </xpath> 
</var-def> 
<case> 
    <if condition="${secondPageLink != null}"> 
     [ process second page ] 
    </if> 
</case> 

En second lieu, le try/catch:

<try> 
    <body> 
     <var-def name="secondPageLink"> 
      <xpath expression="/a[@class='next']/@href"> 
       <var name="firstPage"/> 
      </xpath> 
     </var-def> 
     [ continue to process page ] 
    </body> 
    <catch> 
    </catch> 
</try> 

Le problème avec le test if est que malgré le fait que la variable est vide lorsque aucune seconde page existe (qui Je peux voir à partir du débogage dans le gui), le if semble retourner vrai, et dirige son corps.

Je peux plus facilement voir pourquoi le try/catch ne fonctionne pas correctement, car un xpath ne renvoyant aucune valeur (si la deuxième page n'existe pas) ne constituerait pas une 'erreur' en tant que telle et l'essai toujours réussir. Une autre difficulté est que le @href du lien de page suivante est relatif, et doit donc être ajouté à l'URL de la première page (ou l'URL de base de l'article, en fait, mais la même chose ici), ce qui signifie que mon html -to-xml prend à nouveau l'URL $ {firstPage} $ {secondPageLink}, qui finit simplement par être à nouveau l'URL de la première page, et webharvest traite donc la première page une seconde fois.

Si quelqu'un peut reformuler mon test if pour retourner false lorsque le xpath de secondPageLink renvoie une valeur vide, je serais très reconnaissant!

+0

J'ai également essayé de tester la chaîne exacte que j'attends du secondPageLink. Donc 'condition =" $ {secondPageLink == '? Page = 2'} "'. Cependant, cela ne retourne jamais vrai, donc mes articles de deux pages ne retournent que la première page. – Jangari

Répondre

1

J'ai trouvé une réponse.

This person avait un problème similaire avec if, et une réponse suggéré ici en utilisant la syntaxe: condition="${variable.toString().length() > 0}".

Donc, dans mon code, en remplaçant le test if avec:

<case> 
    <if condition="${secondPageLink.toString().length() > 0}"> 
     <var-def name="secondPageFull"> 
      <html-to-xml> 
       <http url="${commentedArticleURL}${secondPageLink}"/> 
      </html-to-xml> 
[...]     

a produit le résultat correct.