Escriba la consulta para analizar el DOCUMENTO HTML con HtmlAgilityPack

c# html html-agility-pack linq

Pregunta

Quiero obtener el A href de ese elemento en la clase span = "floatClear" cuya calificación es mínima en
abarcan clase = "star-img stars_4"

¿Cómo puedo usar HtmlAgilityPack para lograr este comportamiento? He dado la fuente html de mi archivo

<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 consulta que he escrito.

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

¡Pero no sé cómo aplicar la condición aquí en la última línea de la consulta LINQ!

Respuesta aceptada

No seleccione "calificación" de todo el htmlDoc, selecciónelo en el "principal" encontrado anteriormente.

Supongo que necesitas algo como:

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

Espero que no se bloquee si algunos de esos divs y spans no están presentes: una versión anterior de HtmlAgilityPack devolvió un valor nulo en lugar de una lista vacía cuando SelectNodes no encontró nada.

EDITAR
Es probable que también deba cambiar la "consulta xpath" para las selecciones internas: cambie la "//" a ".//" (adicional al principio) para indicar que realmente desea un subnodo. Si AgilityPack funciona igual que XML-XPath normal (no estoy seguro al 100%), al principio una "//" buscará desde la raíz del documento, incluso si lo especifica desde un subnodo. Un ".//" siempre buscará desde el nodo desde el que está buscando.

A main.SelectNodes("//div[@class='rating']") (probablemente) también encontrará <div class="rating"> s fuera del <div class="rightcol"> que encontró en la línea anterior . Un main.SelectNodes(".//div[@class='rating']") debería solucionarlo.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow