【问题标题】:How can I get the html between 2 surrounding html elements using htmlagilitypack?如何使用 htmlagilitypack 获取 2 个周围 html 元素之间的 html?
【发布时间】:2012-09-07 07:08:00
【问题描述】:

我需要使用带有 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 中找到 id 为 div1 的 div。

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

【问题讨论】:

    标签: c# asp.net html-agility-pack


    【解决方案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");
    

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

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

    TakeWhile 方法 (n =&gt; n != brNode) 中的比较依赖于参考比较(即实现细节部分)。

    最后一个过滤器是只给你元素节点,因为这是你调用SelectSingleNode时通常会得到的;如果要处理其他节点类型,可以省略。

    像这样循环遍历这些节点:

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

    生产:

    Node: strong
    Node: font
    Node: font
    

    【讨论】:

    • 完美!非常感谢。
    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2020-10-04
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多