2017.11.24
2020.1.7

複数の条件を指定してノードを検索する(Html Agility Pack)

Html Agility Packで読み込んだHTMLから複数の条件を指定してノードを検索する方法です。

目次

  • HTMLファイル
  • 複数の条件を指定して検索
  • 参考リンク

HTMLファイル

読み込むHTMLは以下の通りです。(c:\temp\test.html)


<div class="aaa">a1</div>
<div class="aaa">a2</div>
<div>
    <div class="bbb">b1</div>
    <div class="bbb">b2</div>
</div>
<div class="ccc">c1</div>
<div>z1</div>

複数の条件を指定して検索

以下のコードでは、div要素のclassに「aaa」と「bbb」が含まれているノードのみ検索しています。


var doc = new HtmlDocument();
doc.Load(@"c:\temp\test.html");

// classに「aaa」と「bbb」が設定されている(含まれている)ノードのみ検索
var targetClass = new[] { "aaa", "bbb" };
var nodes = doc.DocumentNode.Descendants("div").Where(x =>
{
    return x.Attributes["class"] != null ?
        targetClass.Any(y => x.Attributes["class"].Value.Contains(y)) :
        false;
});

上記のコードは、System.Linqを利用した検索方法になります。

手順としては、DocumentNode.Descendants("div")で子孫ノードからすべてのdiv要素を取得して、Whereで特定の条件に一致する要素のみを抽出しています。

XPATH形式で複数条件を指定することも可能ですが、ぱっと見で何をやっているのか分かり難いので、複雑な条件が必要ならLinqを使ったこちらの書き方がよさそうです。

参考リンク

C#】関連記事