使用Html Agility Pack从html中获取所有文本

输入

foo bar baz

产量

 foo bar baz 

我知道htmldoc.DocumentNode.InnerText ,但它会给htmldoc.DocumentNode.InnerText – 我想得到每个文本,而不是一次。

 var root = doc.DocumentNode; var sb = new StringBuilder(); foreach (var node in root.DescendantNodesAndSelf()) { if (!node.HasChildNodes) { string text = node.InnerText; if (!string.IsNullOrEmpty(text)) sb.AppendLine(text.Trim()); } } 

这可以满足您的需求,但我不确定这是否是最佳方式。 也许你应该迭代DescendantNodesAndSelf以外的东西以获得最佳性能。

XPATH是你的朋友:)

 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"

foo bar baz

"); foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//text()")) { Console.WriteLine("text=" + node.InnerText); }
 var pageContent = "{html content goes here}"; var pageDoc = new HtmlDocument(); pageDoc.LoadHtml(pageContent); var pageText = pageDoc.DocumentNode.InnerText; 

html内容的指定示例:

 

foo bar baz

将产生以下输出:

 foo bar baz 

我需要一个提取所有文本的解决方案,但会丢弃脚本和样式标记的内容。 我无法在任何地方找到它,但我提出了以下适合我自己需要的:

 StringBuilder sb = new StringBuilder(); IEnumerable nodes = doc.DocumentNode.Descendants().Where( n => n.NodeType == HtmlNodeType.Text && n.ParentNode.Name != "script" && n.ParentNode.Name != "style"); foreach (HtmlNode node in nodes) { Console.WriteLine(node.InnerText); 
 public string html2text(string html) { HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(@"" + html + ""); return doc.DocumentNode.SelectSingleNode("//body").InnerText; } 

此解决方法基于Html Agility Pack 。 您也可以通过NuGet(包名: HtmlAgilityPack )安装它。