Obtén enlaces en clase con el paquete de agilidad html

c# html-agility-pack

Pregunta

Hay un montón de tr con la clase alt. Quiero obtener todos los enlaces (o el primero de los últimos) pero no puedo entender cómo con el paquete de agilidad html.

Probé variantes de a pero solo obtengo todos los enlaces o ninguno. No parece solo obtener el que está en el nodo, lo cual no tiene sentido ya que estoy escribiendo n.SelectNodes

html.LoadHtml(page);
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']");
foreach (var n in nS)
{
  var aS = n.SelectNodes("a");
  ...
}

Respuesta aceptada

Puedes usar LINQ:

var links = html.DocumentNode
           .Descendants("tr")
           .Where(tr => tr.GetAttributeValue("class", "").Contains("alt"))
           .SelectMany(tr => tr.Descendants("a"))
           .ToArray();

Tenga en cuenta que esto también coincidirá con <tr class="Malto"> ; es posible que desee reemplazar la llamada Contains con una expresión regular.

También puedes usar Fizzler :

html.DocumentNode.QuerySelectorAll("tr.alt a");

Tenga en cuenta que ambos métodos también devolverán anclas que no son enlaces.


Respuesta popular

¿Por qué no seleccionar todos los enlaces en una sola consulta:

html.LoadHtml(page);
var nS = html.DocumentNode.SelectNodes("//tr[@class='alt']//a");
foreach(HtmlNode linkNode in nS)
{
//do something
}

Es válido para html:

<table>
<tr class = "alt">
<td><'a href="link.html">Some Link</a></td>
</tr>
</table>


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué