繁体   English   中英

如何从HTML字符串(如编号TOC)仅提取标题(即h2,h3,h4)?

[英]How to extract only the headings (i.e h2,h3,h4), from a html string like a numbered TOC?

我想从xhtml字符串中提取标题标签(即h1,h2,h3等)中的所有内容,然后在侧面菜单中使用。

xhtml字符串将带有编号的标题,因此h2类似于“ 1.1 Heading”,在其下的h3带有“ 1.1.1 Heading”和1.1.2,依此类推。

<div class="main-body">
    <h2>1.1 Heading</h2>
    <h3>1.1.1 Subheading</h3>
    <p>Lorem ipsum</p>
    <h3>1.1.2 Another Subheading</h3>
    <p>Lorem ipsum</p>

    <h2>2.1 Heading</h2>
    <h3>2.1.1 Subheading</h3>
    <p>Lorem ipsum</p>
    <h4>2.1.1.1 SubSubHeading</h4>
</div>

上面是html外观的示例,因此我想将其父级(h2)与子级(h3,h4)组合在一起,当在DOM中找到新的h2时,我想创建一个包含它的新组。 “孩子”。

您有两种方法来检索<h1><h6>标记内的所有文本

因此,您输入的html是:

string input = @"<div class='main - body'>
                     <h2> 1.1 Heading </h2>     
                     <h3> 1.1.1 Subheading </h3>        
                     <p> Lorem ipsum </ p >           
                     <h3> 1.1.2 Another Subheading</h3>              
                     <p> Lorem ipsum </p>     
                     <h2> 2.1 Heading </h2>
                     <h3> 2.1.1 Subheading </h3>
                     <p> Lorem ipsum </p>
                     <h4> 2.1.1.1 SubSubHeading </h4>
                 </div> ";

1)使用正则表达式:

使用此正则表达式将标题标签内的所有文本从<h1>更改为<h6>

<h[1-6][^>]*?>(?<TagText>.*?)</h[1-6]>

用法:

string pattern = @"<h[1-6][^>]*?>(?<TagText>.*?)</h[1-6]>";

MatchCollection matches = Regex.Matches(input, pattern);

var heading_matches = matches.Cast<Match>().Select(x => x.Groups["TagText"].Value);

忽略h1然后使用

string pattern = @"<h[2-6][^>]*?>(?<TagText>.*?)</h[2-6]>";

2)使用HtmlAgilityPack:

使用HtmlAgilityPack包检索<h1><h6>所有文本。

您需要从NuGet软件包管理器控制台安装此软件包。

Install-Package HtmlAgilityPack -Version 1.8.14

用法:

var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);

string xpathQuery = "//*[starts-with(name(),'h') and string-length(name()) = 2 and number(substring(name(), 2)) <= 6]";

var texts = htmlDocument.
                DocumentNode
                .SelectNodes(xpathQuery)
                .Select(x => x.InnerText)
                .ToList();

忽略h1然后使用

string xpathQuery = "//*[starts-with(name(),'h') and string-length(name()) = 2 and number(substring(name(), 2)) > 1 and number(substring(name(), 2)) <= 6]";

输出:(来自调试器)

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM