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

HtmlAgilityPack如何筛选DesktopElements前的首个<b>标签文本

解决HtmlAgilityPack爬取特定位置标签的问题

方案一:使用XPath精准筛选

核心思路是利用XPath的节点顺序比较语法,精准定位div.Post下、第一个div.DesktopElements之前的<b>标签,代码示例:

// 假设已加载HtmlDocument实例doc
var postNode = doc.DocumentNode.SelectSingleNode("//div[@class='Post']");
string title = "none";

if (postNode != null)
{
    // 先定位Post下的第一个DesktopElements节点
    var desktopNode = postNode.SelectSingleNode(".//div[@class='DesktopElements']");
    
    if (desktopNode != null)
    {
        // 筛选出在DesktopElements之前的第一个<b>标签
        var targetB = postNode.SelectSingleNode(".//b[. << $desktopNode]", 
            new HtmlParameter("desktopNode", desktopNode));
        title = targetB?.InnerText.Trim() ?? "none";
    }
    else
    {
        // 没有DesktopElements时,直接取Post下的第一个<b>
        var targetB = postNode.SelectSingleNode(".//b");
        title = targetB?.InnerText.Trim() ?? "none";
    }
}

p.Title = title;

关键说明

  • XPath中的<<是节点顺序比较运算符,表示当前节点位于目标节点之前(按文档流顺序)。
  • 使用HtmlParameter传递节点参数,避免XPath字符串拼接问题,同时支持复杂节点引用。

方案二:遍历节点逐行判断

如果对XPath不太熟悉,可通过遍历节点的方式,按文档顺序检查,遇到div.DesktopElements就停止,过程中捕获第一个<b>标签:

var postNode = doc.DocumentNode.SelectSingleNode("//div[@class='Post']");
string title = "none";

if (postNode != null)
{
    // 遍历Post节点下的所有后代节点(按文档顺序)
    foreach (var node in postNode.Descendants())
    {
        // 遇到DesktopElements节点,立即终止遍历
        if (node.Name.Equals("div", StringComparison.OrdinalIgnoreCase) && 
            node.GetAttributeValue("class", "").Equals("DesktopElements", StringComparison.OrdinalIgnoreCase))
        {
            break;
        }
        
        // 找到第一个<b>标签,赋值后终止遍历
        if (node.Name.Equals("b", StringComparison.OrdinalIgnoreCase))
        {
            title = node.InnerText.Trim();
            break;
        }
    }
}

p.Title = title;

关键说明

  • 使用Descendants()按文档顺序遍历所有后代节点,确保不会跳过前置节点。
  • 加入大小写不敏感判断,避免因HTML标签/属性大小写不一致导致的匹配失败。

常见问题修正

之前代码误选后续<b>标签的原因,通常是直接使用//div[@class='Post']//b这类XPath,会匹配div.Post下所有<b>标签,没有限制在div.DesktopElements之前的范围,以上两种方案都针对性解决了这个范围问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:57:27