【问题标题】:Using HtmlAgility to Group Elements Together使用 HtmlAgility 将元素组合在一起
【发布时间】:2011-08-29 20:53:06
【问题描述】:

我正在尝试获取一个 HTML 文档并使用 HTML Agility 根据标题标签将其分组为多个部分 这是原始 HTML 的样子

<h3>Header 1</h3>
<p>Text...</p>
<p>More Text...</p>
<h3Header 2</h3>
<p>Text...</p>
<p>More Text...</p>
<p>Even more Text...</p>
<h3>Header 3</h3>
<p>Some Text...</p>

我想让它在我分组后得到这样的结果

<div id="header_1">
  <h3>Header 1</h3>
  <p>Text...</p>
  <p>More Text...</p>
</div>

<div id="header_2">
  <h3Header 2</h3>
  <p>Text...</p>
  <p>More Text...</p>
  <p>Even more Text...</p>
</div>

<div id="header_3">
  <h3>Header 3</h3>
  <p>Some Text...</p>
</div>

或者像这样

<h3>Header 1</h3>
<div id="header_1">
  <h3>Header 1</h3>
  <p>Text...</p>
  <p>More Text...</p>
</div>


<h3Header 2</h3>
<div id="header_2">
  <p>Text...</p>
  <p>More Text...</p>
  <p>Even more Text...</p>
</div>

<h3>Header 3</h3>
<div id="header_3">
  <p>Some Text...</p>
</div>

HTML 敏捷性很棒,但如果有人知道另一种方法来实现这一点,那就太棒了!

【问题讨论】:

    标签: c# asp.net html-parsing


    【解决方案1】:

    使用 AgilityPack 可以轻松完成。首先你需要获取所有最上面的&lt;h3&gt;s,在每个&lt;h3&gt;之前(或之后)创建一个&lt;div&gt;,然后遍历当前&lt;h3&gt;的以下兄弟姐妹,直到下一个&lt;h3&gt;或兄弟姐妹结尾找到了,最后将这些节点移动到新创建的&lt;div&gt;

    var h3s = doc.DocumentNode.SelectNodes("h3");
    var idx = 1;
    foreach (var h3 in h3s)
    {
        var div = HtmlNode.CreateNode(string.Format("<div id='header_{0}'></div>", idx++));
        h3.ParentNode.InsertBefore(div, h3);
        var group = new List<HtmlNode> { h3 };
    
        for (var next = h3.NextSibling; next != null && next.Name != "h3"; next = next.NextSibling)
            group.Add(next);
    
        foreach (var item in group)
        {
            item.Remove();
            div.AppendChild(item);
        }
    }
    

    这会让你得到类似的东西(我从你的来源更正了&lt;h3Header 2&lt;/h3&gt;):

    <div id='header_1'>
      <h3>Header 1</h3>
      <p>Text...</p>
      <p>More Text...</p>
    </div>
    <div id='header_2'>
      <h3>Header 2</h3>
      <p>Text...</p>
      <p>More Text...</p>
      <p>Even more Text...</p>
    </div>
    <div id='header_3'>
      <h3>Header 3</h3>
      <p>Some Text...</p>
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多