使用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
)安装它。