在HtmlAgilityPack中删除无用的文本节点

5
我正在使用HtmlAgilityPack爬取多个网站。问题是,它似乎坚持在大多数地方插入TextNodes,这些节点要么为空,要么只包含大量的\n、空格和\r。
当我计算子节点数量时,它们往往会给我带来问题,因为Firebug不显示它们,但HtmlAgilityPack却显示它们。
有没有办法告诉HtmlAgilityPack停止这样做,或者至少清除这些文本节点?(我想保留有用的文本节点)。同样的问题也适用于Comment和Script标签。
4个回答

2
您可以使用以下扩展方法:
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();

0

在两个节点之间,“没有空格”和“有一些空格”之间存在差异。因此,仍然需要并且很重要的是所有空白文本节点。

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

有关“如何删除”的信息,请参见this answer


0
创建一个扩展方法,该方法在节点上操作“Child”集合(或类似集合),使用一些LINQ来过滤掉不需要的节点。然后,在遍历树时,可以像这样执行某些操作:
myNode.Children.FilterNodes().ForEach(x => {});

0

我正在寻找更好的答案。目前,我的方法是针对子节点(如表格行和表格单元格)进行处理。节点通过它们的名称TR, TH, TD进行识别,因此我每次都会剥离出#text

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

当然,这很繁琐,需要工作,并且可以通过扩展进行改进。


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