HtmlAgilityPack: Holt alle Elemente nach Klasse

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

Frage

Ich habe ein HTML, und ich muss einige Knoten nach Klasse erhalten. Also kann ich es nicht tun, weil

  1. Ich weiß nicht, XML-Pfad
  2. Artikel benötigt hat keine ID, nur Klasse
  3. HtmlAgilityPack erlaubt nicht, alle Elemente zu erhalten (wie XDocument erlaubt), aber doc.Elements() funktioniert nur, wenn ich eine doc.Elements() habe, aber ich habe nicht. Also ignoriere ich auch den XML-Pfad, so dass ich die SelectNodes Methode nicht verwenden SelectNodes
  4. Ich kann keine regulären Ausdrücke verwenden

Mein Code war

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

aber es funktioniert nicht, da Descendants() nur die nächsten Knoten zurückgibt.

Was kann ich tun?

Akzeptierte Antwort

Lerne XPath! :-) Es ist wirklich einfach und wird dir gut dienen. In diesem Fall ist das, was Sie wollen:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum