如何从HTML中仅提取文本

6

我有一个需求,需要提取html <body> 中出现的所有文本。示例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,然后使用类似于“//body”的xquery来获取主体内容。但是,我该如何像输出中所示那样剥离html?
提前感谢您的帮助 :)

1
请参考这个问题获取一些HTML Agility Pack的链接。我猜你需要在HtmlNode上调用类似于InnerText属性的东西。 - Uwe Keim
4个回答

5
你可以使用 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>worldhello<i>world</i>)将被InnerText转换为helloworld,从而删除了标记。解决该问题很困难,因为显示通常不仅受到标记的影响,还受到CSS的影响。

3
请注意,XPath中的“/html/body”速度更快。 - Richard Schneider
它出现了错误。无法找到HtmlDocument的命名空间。 - ShaileshDev
@Er.ShaileshS.Bankar - 你有 Html Agility Pack 库吗? - Kobi
不,我需要先添加它吗? - ShaileshDev

3
如何使用XPath表达式'//body//text()'来选择所有文本节点?

2
你可以使用支持从HTML提取文本的NUglify:

NUglify

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更快,更友好地处理垃圾回收)。


1
通常情况下,我会建议使用HTML解析器来解析HTML,但是由于您想要删除所有的HTML标签,所以一个简单的正则表达式应该就可以胜任。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接