You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于子元素InnerText过滤HtmlAgilityPack的HtmlNodeCollection?

正确过滤HtmlAgilityPack节点的方法

问题分析

你之前的代码存在两个核心问题:

  1. 使用//是全局路径搜索,会从整个HTML文档中查找h2,而非当前<a>节点的子元素,可能匹配到无关节点;
  2. 每次调用SelectNodes都会返回一个HtmlNodeCollection,最终得到的是集合的集合(IEnumerable<HtmlNodeCollection>),不符合后续逻辑的需求。

正确实现方式

方法一:循环遍历筛选

直接遍历每个<a>节点,检查其内部的h2元素是否包含关键词,符合条件的加入新的HtmlNodeCollection:

string keyWord = "fraude";
HtmlNodeCollection filteredNodes = new HtmlNodeCollection(null);

foreach (HtmlNode aNode in searchResults)
{
    // 相对路径查找当前a节点下的目标h2
    HtmlNode h2Node = aNode.SelectSingleNode(".//h2[@class='search-item__title']");
    // 检查h2存在且文本包含关键词(可选择忽略大小写)
    if (h2Node != null && h2Node.InnerText.IndexOf(keyWord, StringComparison.OrdinalIgnoreCase) >= 0)
    {
        filteredNodes.Add(aNode);
    }
}

方法二:LINQ筛选后转成HtmlNodeCollection

用LINQ先筛选符合条件的节点,再统一添加到HtmlNodeCollection中:

string keyWord = "fraude";
// 先转成IEnumerable<HtmlNode>进行筛选
var matchedNodes = searchResults.Cast<HtmlNode>()
    .Where(aNode => 
    {
        HtmlNode h2Node = aNode.SelectSingleNode(".//h2[@class='search-item__title']");
        return h2Node != null && h2Node.InnerText.Contains(keyWord, StringComparison.OrdinalIgnoreCase);
    });

// 转成HtmlNodeCollection
HtmlNodeCollection filteredNodes = new HtmlNodeCollection(null);
foreach (var node in matchedNodes)
{
    filteredNodes.Add(node);
}

关键注意点

  • 使用.//而非//:.表示从当前节点开始搜索子元素,确保只查找当前<a>节点内部的h2;
  • 增加空值判断:避免h2节点不存在时引发空引用异常;
  • 大小写控制:如果不需要区分关键词大小写,使用StringComparison.OrdinalIgnoreCase,否则直接用Contains(keyWord)即可。

内容的提问来源于stack exchange,提问作者miatochai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:09:15