5

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

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

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

4

4 回答 4

2

You can use the following extension method:

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

And call it like this:

List<HtmlNode> nodes = someNode.GetChildNodesDiscardingTextOnes();
于 2017-09-03T16:50:08.810 回答
0

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

myNode.Children.FilterNodes().ForEach(x => {});
于 2012-07-05T09:12:04.427 回答
0

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

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

另请参阅此答案以了解“如何删除”。

于 2012-07-05T08:55:40.650 回答
0

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

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

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

于 2017-02-24T01:41:27.933 回答