Scrivi query per analizzare HTML DOCUMENT con HtmlAgilityPack

c# html html-agility-pack linq

Domanda

Voglio ottenere l'href A di quell'elemento in span class = "floatClear" il cui punteggio è minimo in
span class = "star-img stars_4"

Come posso utilizzare HtmlAgilityPack per ottenere questo comportamento Ho dato il sorgente HTML del mio file

<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 query che ho scritto

<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>

Ma non so come applicare la condizione qui all'ultima riga della query LINQ!

Risposta accettata

Non selezionare "valutazione" dall'intero htmlDoc, selezionalo dal "main" precedentemente trovato.

Immagino tu abbia bisogno di qualcosa del tipo:

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 };

Spero che non si arresti in modo anomalo se alcuni di questi div non sono presenti: una versione precedente di HtmlAgilityPack ha restituito null invece di una lista vuota quando SelectNodes non ha trovato nulla.

MODIFICARE
Probabilmente hai anche bisogno di cambiare la "query xpath" per le selezioni interne: cambia il "//" in ".//" (extra all'inizio) per segnalare che vuoi veramente un sottonodo. Se AgilityPack funziona come XML-XPath regolare (non sono sicuro al 100%), un "//" all'inizio cercherà dalla radice del documento, anche se lo specifichi da un sottonodo. Un ".//" cercherà sempre dal nodo da cui stai cercando.

Un main.SelectNodes("//div[@class='rating']") troverà (probabilmente) anche <div class="rating"> s al di fuori della <div class="rightcol"> hai trovato nella riga precedente . Un main.SelectNodes(".//div[@class='rating']") dovrebbe risolverlo.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché