Парсинг текста и HTML тегов между двумя нодами с помощью Html Agility Pack

Иконка HTML

Иногда при парсинге HTML требуется вытянуть содержимое, которое находится между двумя нодами, и  мы точно знаем как их идентифицировать. В этой заметке я покажу как можно это сделать используя Html Agility Pack.

Например, имея такой вот HTML:

<div class='start'></div>
    Некий текст,<br /> который надо получить
<div class='end'></div>

мы хотим вытянуть текст между дивами с классами start и end.

Для этого можно использовать такой код:

HtmlDocument document = new HtmlDocument();
            document.LoadHtml("<div class='start'></div>\nНекий текст,<br /> который надо получить\n<div class='end'></div>");

            var startNode = document.DocumentNode.SelectSingleNode("//div[@class='start']");
            var endNode = document.DocumentNode.SelectSingleNode("//div[@class='end']");
            int startNodeIndex = startNode.ParentNode.ChildNodes.IndexOf(startNode);
            int endNodeIndex = endNode.ParentNode.ChildNodes.IndexOf(endNode);
            var nodes = startNode.ParentNode.ChildNodes.Where((n, index) => index > startNodeIndex && index < endNodeIndex).Select(n => n);
            var parsedText = "";
            if (nodes != null)
            {
                foreach (var htmlNode in nodes)
                {
                    parsedText += htmlNode.OuterHtml;
                }
            }

            parsedText = parsedText.Trim();

            Console.WriteLine(parsedText);

Как и ожидалось этот код выведет на экран

Некий текст,<br /> который надо получить

Обратите внимание что при формировании переменной parsedText я использую именно свойство OuterHtml, что бы сохранить в тексте теги (например <br />).

Важно понимать, что ноды это не только HTML теги. Атрибуты, текст,  комментарии и даже сам HTML документ — все это ноды. Подробнее о нодах можно почитать тут. По этой ссылке можно посмотреть пример парсинга контента между комментариями.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>