C#中用Regex提取HTML所有<article>标签内容的方案求助
问题描述
我想在C#中获取网站HTML文档后,用正则表达式(Regex)提取所有<article>标签之间的内容,但之前尝试的正则没成功。附上我的尝试代码和HTML片段,求可行方案。
尝试的正则代码
<article(.*)>(<("["^"]*"|'[^']*'|[^'">])*>|(\n)|)*</article>
HTML文档片段
<div></div> <div class="entry-content"> </div> <div class="kt_archivecontent " > <article id="post-5555"> <div class="row"> <div class="col-md-12 "> <div class="post-text-inner"> <div class="/" rel="category tag">Allgemein</a></div><header> <a >Some Text</h3></a><div class="post-top-meta kt_color_gray"> <span class="postdate kt-post-date updated"> 25. Juli 2022</span> <span class="postauthortop kt-post-author author vcard"> <span class="kt-by-author">by</span><span itemprop="author"> <a href="https://some link" class="fn kt_color_gray" rel="author"> Some text</a> </span> </span> </div> </header> <div class="entry-content"> <p>some Text<a>Read More</a></p> </div> <footer> </footer> </div> </div> </div> </article> <div></div>
解决方案
方案一:修正正则表达式
你的正则存在贪婪匹配和未处理多行内容的问题,修正后可以尝试以下代码:
string html = "你的HTML字符串"; // 正则模式:匹配article标签,非贪婪捕获内部所有内容 string pattern = @"<article[^>]*>([\s\S]*?)<\/article>"; // 启用多行模式和忽略大小写,确保兼容不同格式的HTML Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(html); foreach (Match match in matches) { // Groups[1]就是article标签内的内容 string articleContent = match.Groups[1].Trim(); // 这里处理提取到的内容 }
正则说明
<article[^>]*>:匹配任意属性的<article>起始标签,[^>]*避免误匹配到其他标签([\s\S]*?):非贪婪匹配所有字符(包括换行符\s和非换行符\S),直到遇到第一个</article>RegexOptions.Multiline:让正则正确识别换行内容RegexOptions.IgnoreCase:兼容大小写不同的标签(如<ARTICLE>)
方案二:使用HTML解析库(推荐)
正则处理HTML容易因为标签嵌套、特殊字符、注释等场景失效,更推荐用专门的HTML解析库HtmlAgilityPack,步骤如下:
- 通过NuGet安装HtmlAgilityPack:在NuGet包管理器中搜索并安装
HtmlAgilityPack - 编写解析代码:
using HtmlAgilityPack; string html = "你的HTML字符串"; HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); // 选中所有article节点 HtmlNodeCollection articleNodes = doc.DocumentNode.SelectNodes("//article"); if (articleNodes != null) { foreach (HtmlNode node in articleNodes) { // 获取标签内的HTML内容 string articleContent = node.InnerHtml.Trim(); // 处理内容 } }
这个方法能稳定处理各种复杂HTML结构,避免正则的局限性。
内容的提问来源于stack exchange,提问作者TheGameZ
相关产品推荐
相关产品推荐

