如何从html中提取文本

时间:2011-05-01 09:46:56

标签: c# html-agility-pack

我需要提取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?

提前致谢:)

4 个答案:

答案 0 :(得分: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决定的,而不仅仅是标记。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

通常对于解析html我会推荐一个HTML解析器,但是因为你想要删除所有的html标签,一个简单的正则表达式应该可以工作。

答案 3 :(得分:1)

您可以使用支持HTML文本提取的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自定义解析器,它应该非常健壮(特别是如果文档不包含任何错误)并且非常快(没有regexp但是纯粹的递归下降解析器,比HtmlAgilityPack更快)更多GC友好)