Как я могу извлечь только текст из 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, а не только разметкой.
обычно для синтаксического анализа 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)