Как извлечь только заголовки (т.е. h2, h3, h4) из строки html, такой как пронумерованный оглавление? - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу, чтобы из строки xhtml извлекать все, что находится внутри тегов заголовка (т.е. h1, h2, h3 и т. Д.), Чтобы затем использовать их в боковом меню.

Строка xhtml будет иметь пронумерованные заголовки, поэтому h2 будетчто-то вроде «1.1 Заголовок», и под этим h3 с «1.1.1 Заголовок» и 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, я хочу создать новую группу, содержащую его «children».

1 Ответ

0 голосов
/ 14 февраля 2019

У вас есть два способа получить весь текст внутри тега <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]";

Выход: (из отладчика)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...