You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何拆分含多H1的大HTML为标题与对应文本列表?

问题翻译

我有一份结构固定的大HTML文档,格式如下:

<h1>标题1</h1>
文章内容
<h1>标题2</h1>
文章内容
<h1>标题3</h1>
文章内容

我的目标是创建一个嵌套列表,每个子项包含标题及其后直至下一个标题的文章文本。我尝试了以下代码:

var parts = Regex.Split(html2, @"(<h1>)").Where(l => l !=string.Empty).ToArray().Select(a => Regex.Split(a, @"(</h1>)")).ToArray();

但结果不符合预期,请问有什么方法可以拆分出独立的文章和标题?

解决方案

方法一:用HTML解析库(推荐,避免正则局限性)

用C#的HtmlAgilityPack库处理HTML是更稳健的选择,不会因为内容里的特殊字符或标签出错:

  1. 通过NuGet安装HtmlAgilityPack包
  2. 加载HTML并遍历节点提取内容:
using HtmlAgilityPack;

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html2); // html2为你的原始HTML字符串

var headingNodes = htmlDoc.DocumentNode.SelectNodes("//h1");
var articles = new List<(string Title, string Content)>();

for (int i = 0; i < headingNodes.Count; i++)
{
    var title = headingNodes[i].InnerText.Trim();
    var contentBuilder = new StringBuilder();
    var currentNode = headingNodes[i].NextSibling;

    // 遍历后续节点直到下一个<h1>或文档结束
    while (currentNode != null && currentNode.Name != "h1")
    {
        contentBuilder.Append(currentNode.InnerText.Trim());
        currentNode = currentNode.NextSibling;
    }

    articles.Add((title, contentBuilder.ToString().Trim()));
}

// 生成嵌套列表示例
foreach (var article in articles)
{
    Console.WriteLine($"- {article.Title}");
    Console.WriteLine($"  - {article.Content}");
}

方法二:正则匹配(仅适用于结构完全固定的场景)

如果你的HTML结构绝对单一(内容中无

相关标签、无嵌套
),可以用正则直接匹配完整的标题+内容单元:

using System.Text.RegularExpressions;

// 正则匹配<h1>标题</h1>及后续到下一个<h1>前的内容
var regex = new Regex(@"<h1>(.*?)</h1>\s*(.*?)(?=<h1>|$)", RegexOptions.Singleline);
var matches = regex.Matches(html2);

var articles = new List<(string Title, string Content)>();
foreach (Match match in matches)
{
    var title = match.Groups[1].Value.Trim();
    var content = match.Groups[2].Value.Trim();
    articles.Add((title, content));
}

// 生成嵌套列表示例
foreach (var item in articles)
{
    Console.WriteLine($"- {item.Title}");
    Console.WriteLine($"  - {item.Content}");
}

原代码问题分析

你之前的代码是分步拆分<h1>和</h1>,会把标签、标题文本、内容拆成零散片段,无法直接关联每个标题和对应的内容,而上面的方法要么通过DOM节点遍历关联,要么直接匹配完整单元,逻辑更清晰。

内容的提问来源于stack exchange,提问作者IDP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:35:18