web-dev-qa-db-fra.com

C # html agility pack obtenir des éléments par nom de classe

J'essaie d'obtenir toutes les divs que leur classe contient un certain mot:

<div class="hello mike">content1</div>
<div class="hello jeff>content2</div>
<div class="john">content3</div>

J'ai besoin d'obtenir tous les divs que leur classe contient le mot "bonjour". Quelque chose comme ça:

resultContent.DocumentNode.SelectNodes("//div[@class='hello']"))

comment puis-je le faire avec le pack d'agilité?

11
Ofer Gozlan

J? ai compris:

resultContent.DocumentNode.SelectNodes("//div[contains(@class, 'hello')]"))
17
Ofer Gozlan

Depuis la version v1.6.5 de Html Agility Pack, il contient la méthode d'extension .HasClass("class-name").

IEnumerable<HtmlNode> nodes =
    htmlDoc.DocumentNode.Descendants(0)
        .Where(n => n.HasClass("class-name"));
10
Tohid

Je suis sûr que parce qu'il y a plusieurs classes dans votre div, cela ne fonctionne pas. Vous pouvez essayer ceci à la place:

resultContent.DocumentNode.Descendants("div").Where(d => d.Attributes["class"].Value.Contains("hello"));
8
Bikee

comme vous avez spécifié que la classe doit contenir un certain mot, les éléments suivants garantiront que le mot est:

  • au début de la chaîne et suivi d'un espace
  • ou au milieu de la chaîne et entouré d'espaces
  • ou à la fin de la chaîne et précédé d'un espace
  • ou le seul nom de classe dans l'attribut de classe

Pour ce faire, il compare la valeur de l'attribut class entouré d'espaces avec le mot spécifié (hello) entouré d'espaces. C'est pour éviter les faux positifs comme class="something-hello-something"

resultContent.DocumentNode.SelectNodes("//div[contains(concat(' ', @class, ' '), ' hello ')]");
1
Keith Hall
HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.Load(filePath);
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//div[@class='hello']")
 {
    //code
 }
1
Divyesh