使用HTMLAgilityPack仅提取页面文本

7

好的,我很久之前就开始使用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字符。请给我一些指导。

如果您只想要特定的数据,您需要说明从哪个注释中获取,因为您从各处获取文本。 - Darka
@Darka,我正在尝试为我的搜索引擎构建一个网络爬虫。因此,我希望从网页的任何地方获取有用的文本,特别是我想获取所有<p>标签的内容值。 - Win Coder
2个回答

16
如果您考虑到 script style 节点仅有文本节点作为子节点,则可以使用此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的建议在您的应用程序中处理这些内容。


2

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接