4

C# で htmlagilitypack を使用して、他の 2 つの html 要素に含まれる html 要素を取得する必要があります。

例として、次のようなものがあります。

<div id="div1" style="style definition here">
  <strong>
    <font face="Verdana" size="2">Your search request retrieved 0 matches.</font>
  </strong>
  <font face="Verdana" size="2">Some more text here.</font>
  <br><br>
  <!--more html here-->
</div>

間のすべてを返したい

<div id="div1">

そして最初の

<br>

これらの要素のいずれも返さずに。

これに必要な構文について頭を悩ませることができないので、終了タグを無視して他の2つの既知の開始タグの間に存在するhtmlを取得する最良の方法を誰かが説明してくれたら、本当に感謝します.

また、最初に、完全な Web ページの周囲の html 内で div1 の id を持つ div を見つける必要があることにも言及する必要があります。

実際のノードが特定 のから来たノードと同じ参照を持つ必要はありませんHtmlDocument。それらはコンテンツ的に同じでなければなりません。

4

1 に答える 1

1

インスタンスが返されるHtmlNodeと、同じノードを複数回呼び出すと、同じ参照が生成されます。これを有利に使用できます (ただし、これは実装の詳細なので注意してください)。

基本的に、問題のノードまでの要素であるすべての子孫を取得します。開始するノードを選択します。

HtmlNode divNode = doc.DocumentNode.SelectSingleNode("div[@id='div1']");

上に行きたいノード:

// Note that in this case, working off the first node is not necessary, just
// convenient for this example.
HtmlNode brNode = divNode.SelectSingleNode("br");

次に、クラスのTakeWhile拡張メソッドを使用して、次のように 2 番目の要素まですべての要素を取得します。Enumerable

// The nodes.
IEnumerable<HtmlNode> nodes = divNode.Descendants().
    TakeWhile(n => n != brNode).
    Where(n => n.NodeType == HtmlNodeType.Element);

参照比較に依存するのは、TakeWhileメソッド内の比較 ( ) です (それが実装詳細部分です)。n => n != brNode

最後のフィルターは、要素ノードのみを提供することです。これは通常、 の呼び出しで得られるものですSelectSingleNode。他のノード タイプを処理する場合は、省略できます。

これらのノードを次のように循環します。

foreach (HtmlNode node in nodes)
{
    // Print.
    Console.WriteLine("Node: {0}", node.Name);
}  

プロデュース:

Node: strong
Node: font
Node: font
于 2012-09-10T17:39:52.203 に答える