我需要使用带有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的最佳方式,我会非常感激。
我还应该提一下,我需要首先在完整网页的周围html中找到id为div1的div。
我不需要实际节点与来自特定 HtmlDocument
的节点具有引用相等性,它们只需要在内容方面相同。
答案 0 :(得分: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
extension method上的Enumerable
class将所有元素提取到第二个元素,如下所示:
// 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