Extraire du contenu avec XPath?

c# dom html-agility-pack xml xpath

Question

J'ai le contenu HTML que je stocke en tant que document XML (à l'aide de HTML Agility Pack). Je connais un certain XPath, mais je ne parviens pas à définir exactement le contenu dont j'ai besoin.

Dans l'exemple ci-dessous, j'essaie d'extraire le texte "src" et "alt" de la grande image. Voici mon exemple:

<html>
<body>
   ....
   <div id="large_image_display">
      <img class="photo" src="images/KC0763_l.jpg" alt="Circles t-shirt - Navy" />
   </div>
   ....
   <div id="small_image_display">
      <img class="photo" src="images/KC0763_s.jpg" alt="Circles t-shirt - Navy" />
   </div>
</body>
</html>

Quel est le XPath pour obtenir "images / KC0763_l.jpg" et "t-shirt Cercles - Marine"? C’est ma distance, mais c’est faux. Principalement pseudo-code à ce stade:

<html>
<body>
   ....
   <div id="large_image_display">
      <img class="photo" src="images/KC0763_l.jpg" alt="Circles t-shirt - Navy" />
   </div>
   ....
   <div id="small_image_display">
      <img class="photo" src="images/KC0763_s.jpg" alt="Circles t-shirt - Navy" />
   </div>
</body>
</html>

Toute aide pour obtenir ce droit serait grandement appréciée.

Réponse acceptée

Le xpath suivant vous mènera aux attributs src pour les tags img:

'//html/body/div/img[@class="photo"]/@src'

Et de même cela vous mènera aux attributs alt:

'//html/body/div/img[@class="photo"]/@src'

De là, vous pouvez accéder au texte de l'attribut. Si vous voulez uniquement trouver ceux qui correspondent à 'large_image_display', filtrez-le comme suit:

'//html/body/div/img[@class="photo"]/@src'

Réponse populaire

Utilisez les expressions XPath suivantes :

/html/body/div[@id='large_image_display']/img/@src

et

/html/body/div[@id='large_image_display']/img/@src

Essayez toujours d’éviter d’utiliser l’ abréviation // car cela pourrait entraîner une évaluation très inefficace (l’analyse de la totalité de la (sous) arborescence).

Dans ce cas particulier, nous savons que l'élément html est l'élément supérieur du document et nous pouvons simplement le sélectionner avec /html - pas //html .

Votre problème majeur était que, dans vos expressions, vous utilisiez \ et \\ et il n’existe aucun opérateur de ce type dans XPath. Les opérateurs XPath corrects que vous tentiez d'utiliser sont / et l'abréviation // .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi