XQuery extrait entre deux balises
-
29-09-2019 - |
Question
Je travaille actuellement sur l'extraction de données à partir HTML
. Je voudrais extraire le texte entre deux balises <p class="xfHeading">
.
<p class="xfHeading"><b>XYZ:</b></p>
<p>asdfghjk</p>
<p>sdsdsd</p>
<p>asdvcvcfghjk</p>
<p class="xfHeading"><b>ABC:</b></p>
<P>fvgbhnjm</P>
<p class="xfHeading"><b>PQR:</b></p>
<ul>
</ul>
<p class="xfHeading"><b>MNO:</b></p>
<ul>
<li>jdjshdj</li>
</ul>
sortie devrait être:
asdfghjk
sdsdsd
asdvcvcfghjk
Une façon de le faire est:
/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]
ou
/p[class="xfHeading"]/following-sibling::p[position()<4]
Cependant, puisque le contenu entre continue à changer tout le temps que je besoin d'une solution dans laquelle le contenu entre les deux balises <p class="xfHeading">
est extrait.
La solution
Utilisez :
(//p[@class="xfHeading"])[1]
/following-sibling::p
[. << (//p[@class="xfHeading"])[2]]
/text()
Ce moyen : Sélectionnez les enfants texte-nœud de tous les éléments p
qui suivent les frères et sœurs du premier élément de p
dans le document avec une valeur ayant attribut class
de xfHeading
, et en même temps sont précédant le deuxième élément de p
dans le document avec l'attribut class
ayant une valeur de xfHeading
.
Autres conseils
EDIT : Après cet éclaircissement, ma suggestion est d'utiliser un FLWOR expression telle que ce qui suit. Cela ressemble à un <p>
avec le contenu des balises de <b>
appropriées en fonction du contenu unique de cette étiquette de <b>
, et renvoie le texte de chaque balise <p>
qui est un frère de celui-ci.
for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
where $b/text() = "XYZ:"
return p/text()
Notez que la //
est une construction XPATH, pas un commentaire
RÉPONSE VIEUX : Sans un exemple de ce que vous souhaitez les données résultantes ressemblent, répondant à la question est un peu difficile. Cependant, pour sélectionner, par exemple, le texte dans une balise <b>
, vous feriez:
/p[class = "xfHeading"]/b/text()
En général, annexant text()
à la fin d'une expression renvoie le texte à l'intérieur du nœud en question.