HtmlAgilityPack: obtener todos los elementos por clase

.net asp.net c# html-agility-pack regex

Pregunta

Tengo un HTML y necesito obtener algunos nodos por clase. Así que no puedo hacerlo porque

  1. No sé la ruta XML
  2. Los artículos necesarios no tienen identificación, solo clase
  3. HtmlAgilityPack no permite obtener todos los elementos (como XDocument permite XDocument ), pero doc.Elements() solo funciona si tengo una identificación, pero no la tengo. Así que también sé la ruta XML, así que no puedo usar el método SelectNodes
  4. No puedo usar expresiones regulares

mi código era

public static class HapHelper
{
    private static HtmlNode GetByAttribute(this IEnumerable<HtmlNode> htmlNodes, string attribute, string value)
    {
        return htmlNodes.First(d => d.HasAttribute(attribute) && d.Attributes[attribute].ToString() == value);
    }

    public static HtmlNode GetElemenyByAttribute(this HtmlNode parentNode, string attribute, string value)
    {
        return GetByAttribute(parentNode.Descendants(), attribute, value);
    }

    public static bool HasAttribute(this HtmlNode d, string attribute)
    {
        return d.Attributes.Contains(attribute);
    }

    public static HtmlNode GetElementByClass(this HtmlNode parentNode, string value)
    {
        return parentNode.GetElemenyByAttribute("class", value);
    }
}

pero no funciona, porque los Descendants() solo devuelven los nodos más cercanos.

¿Que puedo hacer?

Respuesta aceptada

¡Aprende XPath! :-) Es muy simple y te servirá bien. En este caso, lo que quieres es:

SelectNodes("//*[@class='" + classValue + "']") ?? Enumerable.Empty<HtmlNode>();


Related

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é