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

HTMLAgilityPack的Descendants方法未返回所有子节点求助

解决li节点遍历无法获取全部子元素的问题

你在遍历<li>节点时仅获取到7个节点,后续的<div>元素未被返回,尝试使用Descendants方法也无法获取文本后的div节点。对应的HTML结构如下(用|替代尖括号展示):

|li|
|div display="flex" class="css-wjome"|
    |span|
        |svg|
            |use||/use|
        |/svg|
    |/span|
    |div|
        |span|stuff|/span|
    |/div|
|/div|
|div|
    |span|
        |div|
            |blockquote|stuff|/blockquote|
        |/div|
    |/span|
|/div|
|/li|

可行的解决办法

  • 调整节点遍历逻辑:如果之前用ChildNodes仅获取直接子节点,切换为无参数的Descendants()方法,它会返回<li>下所有层级的后代节点,包括第二个<div>及其内部元素。
  • 过滤空白文本节点:部分HTML解析库会把换行、空格等空白内容视为文本节点,导致计数混乱。以HtmlAgilityPack为例,可过滤掉这类无效节点:
    var validNodes = liNode.Descendants().Where(n => 
        n.NodeType != HtmlNodeType.Text || !string.IsNullOrWhiteSpace(n.InnerText.Trim())
    );
    
  • 直接定位目标节点:如果明确要获取第二个<div>或包含<blockquote>的节点,可通过定向查询快速获取:
    // 获取<li>下的第二个div节点
    var secondDiv = liNode.ChildNodes.OfType<HtmlNode>()
                        .Where(n => n.Name.Equals("div", StringComparison.OrdinalIgnoreCase))
                        .Skip(1)
                        .FirstOrDefault();
    
    // 或者直接定位包含blockquote的div
    var blockquoteDiv = liNode.Descendants("div")
                            .FirstOrDefault(d => d.Descendants("blockquote").Any());
    
  • 确认HTML完整性:检查待解析的HTML是否完整,若来自网页抓取,确保请求已获取全部页面内容,避免因HTML截断导致节点缺失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:12