HtmlAgilityPack: получить все элементы по классам

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

Вопрос

У меня есть HTML, и мне нужно получить некоторые узлы по классам. Поэтому я не могу этого сделать, потому что

  1. Я не знаю путь XML
  2. Необходимые элементы не имеют идентификатора, только класс
  3. HtmlAgilityPack не позволяет получить все элементы (например, XDocument разрешает), но doc.Elements() работает только в том случае, если у меня есть идентификатор, но у меня его нет. Поэтому я также не знаю путь XML, поэтому я не могу использовать метод SelectNodes
  4. Я не могу использовать регулярные выражения

мой код был

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

но это не работает, потому что Descendants() возвращает только ближайшие узлы.

Что я могу сделать?

Принятый ответ

Изучите XPath! :-) Это очень просто и хорошо послужит вам. В этом случае вы хотите:

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow