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

c# html-agility-pack

Вопрос

У меня есть требование извлечь весь текст, который присутствует в <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, например «тело», мы можем получить содержимое тела. Но как мне удалить html, как я показал на выходе?

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

Принятый ответ

Вы можете использовать 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 в helloworld - удаление тегов. Трудно решить эту проблему, поскольку отображение зависит от CSS, а не только от разметки.


Популярные ответы

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



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему