Как я могу извлечь только текст из HTML - PullRequest
6 голосов
/ 01 мая 2011

У меня есть требование извлечь весь текст, который присутствует в <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 ]

5 голосов
/ 01 мая 2011

Вы можете использовать тело 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, а не только разметкой.

3 голосов
/ 01 мая 2011

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

1 голос
/ 17 мая 2016

Вы можете использовать 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 friendly)

1 голос
/ 01 мая 2011

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

...