正規表現をHtmlAgilityPackにC#


質問

私はHtmlAgilityPackライブラリを使用する他のWebサイトの文字列と一致させるために正規表現を使用するコードを変換する方法を知りたいと思います。

コード例:

<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>

私の現在のコードは次のとおりです:

<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>

そして、それは動作します。

私はHtmlAgilityPackで試しました:

<div class="element"><div class="title"><a href="127.0.0.1" title="A.1">A.1</a></div></div>
<div class="element"><div class="title"><a href="127.0.0.1" title="A.2">A.2</a></div></div>

しかし、それはA.1だけを追加します。

どのようにできるのか?

受け入れられた回答

あなたのregex "title=\"(.+?)\">"は、HTMLドキュメント内の任意のタグ内の任意のtitle属性にマッチしキャプチャします。

したがって、 title属性を含む任意の要素ノード( * )を取得し、属性ノードを反復し、その名前がtitleたら、その値をリストに追加する//*[@title] XPathで別のコードを使用します。

var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
   foreach (var node in nodes)
   {
       foreach (var attribute in node.Attributes)
           if (attribute.Name == "title")
               Cap.Add(attribute.Value);
   }
}

またはLINQを使用する:

var nodes = Web.DocumentNode.SelectNodes("//*[@title]");
if (nodes != null)
{
   foreach (var node in nodes)
   {
       foreach (var attribute in node.Attributes)
           if (attribute.Name == "title")
               Cap.Add(attribute.Value);
   }
}




ライセンスを受けた: CC-BY-SA
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ