Requête d'écriture pour analyser le document HTML avec HtmlAgilityPack

c# html html-agility-pack linq

Question

Je veux obtenir le href de cet élément dans span class = "floatClear" dont l'évaluation est minimale en
span class = "star-img stars_4"

Comment puis-je utiliser HtmlAgilityPack pour obtenir ce problème? J'ai donné la source HTML de mon fichier

<div class="businessresult">  //will repeat


      <div class="rightcol">

       <div class="rating">

        <span class="star-img stars_4">
          <img height="325" width="84" src="http://media1.px" alt="4.0 star rating"   **title**="4.0 star rating">
         </span>

        </div>
      </div>

        <span class="floatClear">
             <a class="ybtn btn-y-s" href="/writeareview/biz/KaBw8UEm8u6war_loc%NY">
        </span>
</div>

La requête que j'ai écrite

<div class="businessresult">  //will repeat


      <div class="rightcol">

       <div class="rating">

        <span class="star-img stars_4">
          <img height="325" width="84" src="http://media1.px" alt="4.0 star rating"   **title**="4.0 star rating">
         </span>

        </div>
      </div>

        <span class="floatClear">
             <a class="ybtn btn-y-s" href="/writeareview/biz/KaBw8UEm8u6war_loc%NY">
        </span>
</div>

Mais je ne sais pas comment appliquer la condition ici à la dernière ligne de la requête LINQ!

Réponse acceptée

Ne sélectionnez pas "rating" dans l'ensemble de htmlDoc, sélectionnez-le dans le "principal" précédemment trouvé.

Je suppose que vous avez besoin de quelque chose comme:

var lowestreview = 
  from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='rightcol']") 
   from rating in main.SelectNodes("//div[@class='rating']")
     from ratingspan in rating.SelectNodes("//span[@class='star-img stars_4']")
      from floatClear in ratingspan.SelectNodes("//span[@class='floatClear']")
   select new { Rate = ratingspan.InnerText, AHref = floatClear.InnerHtml };

J'espère qu'il ne tombera pas en panne si certaines de ces SelectNodes ne sont pas présentes: une version précédente de HtmlAgilityPack renvoyait la valeur null au lieu d'une liste vide lorsque les SelectNodes n'avaient rien trouvé.

MODIFIER
Vous aurez probablement aussi besoin de changer la "requête xpath" pour les sélections internes: changez le "//" en ".//" (extra au début) pour indiquer que vous voulez vraiment un sous-noeud. Si AgilityPack fonctionne de la même manière que XML-XPath classique (je ne suis pas sûr à 100%), un "//" au début de la recherche recherchera à la racine du document, même si vous le spécifiez à partir d'un sous-noeud. Un ".//" recherchera toujours à partir du nœud que vous recherchez.

Un main.SelectNodes("//div[@class='rating']") trouvera (probablement) également <div class="rating"> à l'extérieur du <div class="rightcol"> vous avez trouvé à la ligne précédente. . main.SelectNodes(".//div[@class='rating']") devrait résoudre ce problème.




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