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

如何在C#中使用HTMLAgilityPack区分相同类名的HTML节点并获取目标节点

解决HTMLAgilityPack区分同class节点的问题

刚好我之前也碰到过这种需要通过父节点层级区分同class元素的场景,用HTMLAgilityPack的XPath或者LINQ查询都能完美解决,给你两种实用方案:

方案1:XPath精准定位(推荐,简洁高效)

HTMLAgilityPack对XPath支持非常好,我们可以直接根据DOM结构写查询语句,有两种思路:

思路A:固定层级路径查询

如果你的网页DOM结构比较固定,直接按层级写路径就能精准命中目标节点:

using HtmlAgilityPack;

// 加载HTML内容(替换成你实际获取的HTML字符串)
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(yourHtmlContent);

// 直接定位到product-top下三层的price节点
var targetPriceNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='product-top']/div/div/div[@class='price']");

// 获取节点文本
if (targetPriceNode != null)
{
    string desiredPrice = targetPriceNode.InnerText.Trim();
    // 这里处理你的业务逻辑
}

思路B:祖先节点筛选(更灵活)

如果网页中间的层级或子节点class可能有变动,用祖先节点筛选的方式更健壮,只要price节点的祖先中存在product-top的div就能匹配:

var targetPriceNode = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='price'][ancestor::div[@class='product-top']]");

注意:如果节点的class属性包含多个值(比如class="product-top active"),直接用[@class='product-top']会匹配失败,这时候可以用更严谨的写法:

//div[@class='price'][ancestor::div[contains(concat(' ', @class, ' '), ' product-top ')]]

这种写法可以避免部分匹配的问题(比如不会误匹配product-top-extra这类class)。

方案2:LINQ查询法(适合喜欢LINQ语法的开发者)

如果你更习惯用LINQ的方式操作节点,也可以这样写:

var targetPriceNode = htmlDoc.DocumentNode
    .Descendants("div")
    // 先筛选所有class为price的div节点
    .Where(node => node.GetAttributeValue("class", "") == "price")
    // 再筛选其中有祖先div的class为product-top的节点
    .FirstOrDefault(node => node.Ancestors("div")
        .Any(ancestor => ancestor.GetAttributeValue("class", "") == "product-top"));

if (targetPriceNode != null)
{
    string desiredPrice = targetPriceNode.InnerText.Trim();
    // 处理业务逻辑
}

前置准备

别忘了先通过NuGet安装HTMLAgilityPack包:

  • 对于.NET Framework:在Package Manager Console执行 Install-Package HtmlAgilityPack
  • 对于.NET Core/.NET 5+:在终端执行 dotnet add package HtmlAgilityPack

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:08:15