【问题标题】:Removing useless TextNodes in HtmlAgilityPack删除 HtmlAgilityPack 中无用的 TextNode
【发布时间】:2012-07-05 08:43:59
【问题描述】:

我正在使用 HtmlAgilityPack 抓取一些网站。问题是它似乎坚持在大多数地方插入 TextNode,这些地方要么是空的,要么只包含大量的 \n、空格和 \r。

当我计算 childnodes 时,它们往往会给我带来问题,因为 firebug 不会显示它们,但 HtmlAgilityPack 会。

有没有办法告诉 HtmlAgilityPack 停止这样做,或者至少清除这些文本节点? (不过我想保留有用的)。当我们在这里时,评论和脚本标签也是如此。

【问题讨论】:

    标签: c# web-scraping html-agility-pack


    【解决方案1】:

    您可以使用以下扩展方法:

    static class HtmlNodeExtensions
    {
        public static List<HtmlNode> GetChildNodesDiscardingTextOnes(this HtmlNode node)
        {
            return node.ChildNodes.Where(n => n.NodeType != HtmlNodeType.Text).ToList();
        }
    }
    

    然后这样称呼它:

    List<HtmlNode> nodes = someNode.GetChildNodesDiscardingTextOnes();
    

    【讨论】:

      【解决方案2】:

      两个节点之间的“无空白”和“一些空白”之间存在差异。所以仍然需要全空白文本节点并且很重要。

      你不能在开始“真正的抓取”之前预处理 html 并删除所有不需要的节点吗?

      另请参阅 this answer 了解“如何删除”。

      【讨论】:

        【解决方案3】:

        在使用某些 LINQ 过滤掉不需要的节点的节点上创建对“子”集合(或类似集合)进行操作的扩展方法。然后,当您遍历树时,请执行以下操作:

        myNode.Children.FilterNodes().ForEach(x => {});
        

        【讨论】:

          【解决方案4】:

          我正在寻找更好的答案。这是我目前关于子节点(如表格行和表格单元格)的方法。节点由它们的名称TR, TH, TD 标识,所以我每次都去掉#text

          List<HtmlNode> rows = table.ChildNodes.Where(w => w.Name != "#text").ToList();
          

          当然,这很乏味且有效,可以通过扩展来改进。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-08
            相关资源
            最近更新 更多