web-dev-qa-db-ja.com

C#htmlアジリティパックはクラス名で要素を取得します

クラスに特定のWordが含まれているすべてのdivを取得しようとしています。

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

クラスに "hello"という単語が含まれているすべてのdivを取得する必要があります。このようなもの:

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

アジリティパックでそれを行うにはどうすればよいですか?

11
Ofer Gozlan

わかった:

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

Html Agility Packのバージョンv1.6.5以降、.HasClass("class-name")拡張メソッドが含まれています。

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

Divに複数のクラスがあるため、きちんと機能しないと思います。代わりにこれを試すことができます:

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

クラスに特定のWordを含める必要があると指定したので、次のようにすると、Wordが確実に含まれます。

  • 文字列の先頭にスペースが続きます
  • または文字列の中央にあり、空白で囲まれています
  • または文字列の最後で、前にスペースを置く
  • またはclass属性の唯一のクラス名

これは、スペースで囲まれたクラス属性の値を、スペースで囲まれた指定されたWord(hello)と比較することによって行われます。これは、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