HtmlAgilityPack: ottieni tutti gli elementi per classe

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

Domanda

Ho un HTML e ho bisogno di ottenere alcuni nodi per classe. Quindi non posso farlo perché

  1. Non so il percorso XML
  2. Gli articoli necessari non hanno ID, solo classe
  3. HtmlAgilityPack non consente di ottenere tutti gli elementi (come consentito da XDocument ), ma doc.Elements() funziona solo se ho un ID, ma non l'ho. Quindi non so neanche il percorso XML, quindi non posso usare il metodo SelectNodes
  4. Non posso usare espressioni regolari

il mio codice 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);
    }
}

ma non funziona, perché Descendants() restituisce solo i nodi più vicini.

Cosa posso fare?

Risposta accettata

Impara XPath! :-) È davvero semplice e ti servirà bene. In questo caso, quello che vuoi è:

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché