c# - 使用 HTMLAgilityPack 仅提取页面文本

标签 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 字符。

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

最佳答案

如果您认为scriptstyle 节点只有子节点的文本节点,您可以使用这个XPath 表达式来获取script 中没有的文本节点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 的建议在您的应用程序中处理。

关于c# - 使用 HTMLAgilityPack 仅提取页面文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343231/

相关文章:

c# - 使用 Microsoft.Data.Sqlite C# 获取最后一个插入 rowid

c# - 如何在文本框右侧开始输入数字?

c# - WCF 客户端连接问题

java - 如何点击左侧菜单项

html - nokogiri 多个 css 类

C# - 字典式列表的互锁增量

c# - 为什么它是StackOverFlow异常?

.net - 使用 odbc 连接到在线 mysql 数据库,访问表时出现权限被拒绝错误

asp.net - .NET 4.7 连接字符串格式的用户 secret

java - 如何从 xsd 生成 xpath?