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是更稳健的选择,不会因为内容里的特殊字符或标签出错:
- 通过NuGet安装
HtmlAgilityPack包 - 加载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
相关产品推荐
相关产品推荐

