使用 HTMLAgilityPack 仅提取页面文本

2023-11-25

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

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


如果你考虑到这一点script and style节点只有子节点的文本节点,您可以使用此 XPath 表达式来获取不在子节点中的文本节点script or style标签,这样你就不需要事先删除节点:

//*[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 的建议进行处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HTMLAgilityPack 仅提取页面文本 的相关文章

随机推荐