在HtmlAgilityPack中删除无用的TextNodes

时间:2012-07-05 08:43:59

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

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

当我计算子节点时,它们往往会引起我的问​​题,因为firebug没有显示它们,但HtmlAgilityPack会这样做。

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

4 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

创建一个扩展方法,该方法对使用某些LINQ过滤掉不需要的节点的节点上的“Child”集合(或类似)进行操作。然后,当你遍历你的树时,做这样的事情:

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

答案 3 :(得分:0)

我正在寻找更好的答案。这是关于像表行和表格单元格这样的子节点的当前方法。节点的名称由TR, TH, TD标识,因此我每次都会删除#text

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

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