【问题标题】: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();
当然,这很乏味且有效,可以通过扩展来改进。