加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用htmlagilitypack获取2个周围html元素之间的html?

发布时间:2020-12-15 21:39:58 所属栏目:百科 来源:网络整理
导读:我需要使用带有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 fac
我需要使用带有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>

没有返回这些元素.

我无法理解为此所需的语法,所以如果有人能够向我解释在忽略结束标记的同时获得其他两个已知开始标记之间存在的html的最佳方法,我会非常感激.

我还要提一下,我需要首先在完整网页的周围html中找到div为id的div.

我不需要实际节点与来自特定HtmlDocument的节点具有引用相等性,它们只需要在内容方面相同.

解决方法

返回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");

然后使用Enumerable class上的TakeWhile extension method将所有元素提取到第二个元素,如下所示:

// 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读