使用HTMLAgilityPack仅提取页面文本

好的,我对HTMLAgilityPack中使用的XPath查询真的很陌生。

所以我们可以考虑这个页面http://health.yahoo.net/articles/healthcare/what-your-favorite-flavor-says-about-you 。 我想要的只是提取页面内容而不是其他内容。

所以我首先删除脚本和样式标签。

Document = new HtmlDocument(); Document.LoadHtml(page); TempString = new StringBuilder(); foreach (HtmlNode style in Document.DocumentNode.Descendants("style").ToArray()) { style.Remove(); } foreach (HtmlNode script in Document.DocumentNode.Descendants("script").ToArray()) { script.Remove(); } 

之后,我尝试使用// text()来获取所有文本节点。

 foreach (HtmlTextNode node in Document.DocumentNode.SelectNodes("//text()")) { TempString.AppendLine(node.InnerText); } 

然而,不仅我不仅仅获得文本我也获得了无数/ r / n字符。

请在这方面我需要一些指导。

如果您认为scriptstyle节点只有子节点的文本节点,则可以使用此XPath表达式来获取不在scriptstyle标记中的文本节点,这样您就不需要事先删除节点:

 //*[not(self::script or self::style)]/text() 

您可以使用XPath的normalize-space()进一步排除仅为空格的文本节点:

 //*[not(self::script or self::style)]/text()[not(normalize-space(.)="")] 

或者更短

 //*[not(self::script or self::style)]/text()[normalize-space()] 

但是您仍然会获得可能具有前导或尾随空格的文本节点。 这可以在您的应用程序中处理,如@ aL3891所示。

如果最终字符串中的\r \n字符是问题,您可以在事后删除它们:

 TempString.ToString().Replace("\r", "").Replace("\n", "");