使用 HTMLAgilityPack 仅提取页面文本

本文关键字:文本 提取 HTMLAgilityPack 使用 | 更新日期: 2023-09-27 18:35:18

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

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

使用 HTMLAgilityPack 仅提取页面文本

如果您认为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", "");