【问题标题】:extracting just page text using HTMLAgilityPack使用 HTMLAgilityPack 仅提取页面文本
【发布时间】:2013-10-21 00:21:26
【问题描述】:

好的,所以我对 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 基本上我正在尝试为我的搜索引擎构建一个网络爬虫。所以我想基本上从网页的任何地方获取有用的文本,特别是我想获取所有

    标签的内容值。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您认为scriptstyle 节点只有子节点的文本节点,您可以使用此XPath 表达式来获取不在scriptstyle 标记中的文本节点,这样您就不会' t需要事先删除节点:

    //*[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 的建议在您的应用程序中处理。

    【讨论】:

      猜你喜欢
      • 2022-11-23
      • 2012-07-19
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2016-06-15
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多