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
相关产品推荐
相关产品推荐

