Как я могу извлечь только текст из html

у меня есть требование, чтобы извлечь весь текст, который присутствует в <body> html. Пример ввода Html: -

<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src="abc.jpg"/>
    </body>
</html>

выход должен быть : -

This is a big title. How are doing you? I am fine

Я хочу использовать только HtmlAgility для этой цели. Никаких регулярных выражений, пожалуйста.

Я знаю, как загрузить HtmlDocument, а затем с помощью xquery, например "//body", мы можем получить содержимое тела. Но как мне удалить html, как я показал в выводе?

спасибо заранее :)

4 ответов


вы можете использовать InnerText:

string html = @"
<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src=""abc.jpg""/>
    </body>
</html>";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.SelectSingleNode("//body").InnerText;

Далее, вы можете свернуть пробелы и новые строки:

text = Regex.Replace(text, @"\s+", " ").Trim();

заметим, однако, что пока он работает в этом случае, разметка, например hello<br>world или hello<i>world</i> будет преобразован InnerText to helloworld - удаление тегов. Трудно решить эту проблему, так как отображение определяется CSS, а не только разметкой.


Как насчет использования выражения XPath '//body//text()' выбрать все текстовые узлы?


обычно для синтаксического анализа html я бы рекомендовал синтаксический анализатор HTML, однако, поскольку вы хотите удалить все теги html, должно работать простое регулярное выражение.


можно использовать NUglify который поддерживает извлечение текста из HTML:

var result = Uglify.HtmlToText("<div>  <p>This is <em>   a text    </em></p>   </div>");
Console.WriteLine(result.Code);   // prints: This is a text

поскольку он использует пользовательский парсер HTML5, он должен быть довольно надежным (особенно, если документ не содержит ошибок) и очень быстрым (без регулярного выражения, но чистый рекурсивный парсер спуска, быстрее, чем HtmlAgilityPack и более дружественный к GC)