2013-07-28 4 views
0

J'ai beaucoup de html et je veux le traiter via xpath. Il existe deux façons possibles texte peut se produire:Récupérer du texte avec xpath dans la structure html dynamique

<div> 
    The Text 
</div> 
<!-- OR --> 
<div> 
    <span>The Text</span> 
</div> 
<!-- BUT NOT --> 
<div> other text 
    <span>The Text</span> 
</div> other text 

Est-il possible que je peux chercher « le texte » avec une seule expression XPath?

modifier:

structure en béton:

<div id="content"> 
<h1>...</h1> 
<div> 
    ... 
</div> 
<div> 
    <span>The Text</span> 
</div> 

Je reçois le nœud de contenu via //div[@id='content'][1] et le réutiliser à d'autres fins. Sur ce nœud de contexte, j'ai essayé d'exécuter ./div[2]/span/text() | ./div[not(span)][2]/text(). Cela fonctionne s'il n'y a pas de span, mais retourne blank/null s'il y a un spawn. Im en utilisant l'implémentation Java xpath. La div est toujours la deuxième du noeud de contenu.

+0

Il suffit d'obtenir la div et lire sa propriété textContent – Musa

+0

Il serait utile de montrer ce que XPath vous avez essayé, quel était le résultat, et en quoi il diffère du résultat que vous vouliez. – LarsH

Répondre

1
div/span/text() | div[not(span)]/text() 

devrait faire l'affaire. Ceci sélectionne les nœuds de texte enfants du <span> (s'il y a un <span>), ainsi que les nœuds de texte enfants du <div> s'il n'y a pas de <span>.

Vous devrez modifier les parties div pour refléter le contexte à partir duquel vous évaluez l'expression XPath. Si vous voulez le faire avec tous les éléments <div> dans le document, modifiez div à //div.

Mise à jour:

Sur la base des nouvelles informations de contexte que vous avez publié, le XPath ci-dessus doit être modifié pour:

./div[2]/span/text() | ./div[2][not(span)]/text() 

Cependant, je ne vois pas pourquoi votre version retourne pas de texte quand il y a un élément <span>. Pouvez-vous donner plus de contexte - votre code Java qui évalue le XPath; peut-être un extrait plus détaillé de votre entrée HTML? L'exemple HTML est-il vraiment représentatif de votre contribution réelle? Pourrait-il y avoir un autre </div> là-bas qui passe inaperçu?

+0

J'ai ajouté un exemple meilleur et plus concret, LarsH – cara

+0

@cara, j'ai mis à jour ma réponse en conséquence. – LarsH

+0

Ça marche enfin maintenant, merci. Je ne sais pas où était le problème, je pourrais jurer d'avoir déjà essayé ... – cara

Questions connexes