我正在使用HtmlAgilityPack抓取一些网站。问题是它似乎坚持在大多数地方插入TextNodes,这些地方要么是空的,要么只包含大量的\ n,空格和\ r。
当我计算子节点时,它们往往会引起我的问题,因为firebug没有显示它们,但HtmlAgilityPack会这样做。
有没有办法告诉HtmlAgilityPack停止这样做,或者至少清除这些文本节点? (我想保留有用的)。虽然我们在这里,但评论和脚本标签也是如此。
答案 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();
当然,它很乏味且有效,可以通过扩展来改善。