使用HTMLAgilityPack仅提取页面文本

时间:2013-10-13 08:28:07

标签: c# .net xpath xml-parsing html-agility-pack

好的,我对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字符。

我在这方面需要一点指导。

2 个答案:

答案 0 :(得分:12)

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

style

您可以使用XPath的//*[not(self::script or self::style)]/text() 进一步排除仅为空格的文本节点:

normalize-space()

或更短的

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

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

答案 1 :(得分:2)

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

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