我需要提取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?
提前致谢:)
答案 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>world
或hello<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友好)