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

使用HtmlAgilityPack从命名不规范HTML提取指定值的问题

从结构不规范的HTML中提取护甲等级和生命值数值

问题背景

目标HTML结构如下:

<div class="container-entry">
    <h1 class="entry-heading">Aarakocra</h1>
    <div class="entry-metadata">
        <h2 class="entry-metadata-label">Armor Class: </h2>
        <h2 class="entry-metadata-label">12</h2>
    </div><div class="entry-metadata">
        <h2 class="entry-metadata-label">hit Points: </h2>
        <h2 class="entry-metalabel-content">13 (3d8)</h2></div>

需要提取其中的12(护甲等级)和13 (3d8)(生命值)。原代码尝试通过匹配文本找节点,但输出的是枚举类型的字符串,无法获取目标值。

问题原因

  1. 原代码中node.Equals("Armor Class: ")是将HtmlNode对象与字符串直接比较,逻辑错误,永远匹配不到节点。
  2. 直接对Where返回的枚举器调用ToString(),输出的是枚举类型的名称,而非节点内容。

解决方案

利用节点的文本内容匹配,再通过兄弟节点关系或class选择器提取目标值:

提取护甲等级(Armor Class)

找到文本为Armor Class: 的h2节点,取它的下一个兄弟节点的文本:

HtmlAgilityPack.HtmlWeb website = new HtmlAgilityPack.HtmlWeb();
HtmlAgilityPack.HtmlDocument pageMonsterStats = website.Load(websiteUrl + "/" + monsterName);
var monsterNode = pageMonsterStats.DocumentNode.SelectSingleNode("//div[@class='container-entry']");

// 提取护甲等级
var acLabelNode = monsterNode.Descendants("h2")
    .FirstOrDefault(n => n.InnerText.Trim() == "Armor Class:");
if (acLabelNode != null)
{
    var acValue = acLabelNode.NextSibling.InnerText.Trim();
    Console.WriteLine($"护甲等级: {acValue}"); // 输出12
}

提取生命值(Hit Points)

可以通过文本匹配找标签节点,再取兄弟节点;也可以直接通过目标节点的class提取:

// 方法1:通过标签节点找兄弟节点
var hpLabelNode = monsterNode.Descendants("h2")
    .FirstOrDefault(n => n.InnerText.Trim() == "hit Points:");
if (hpLabelNode != null)
{
    var hpValue = hpLabelNode.NextSibling.InnerText.Trim();
    Console.WriteLine($"生命值: {hpValue}"); // 输出13 (3d8)
}

// 方法2:直接通过class选择目标节点
var hpValueNode = monsterNode.SelectSingleNode("//h2[@class='entry-metalabel-content']");
if (hpValueNode != null)
{
    Console.WriteLine($"生命值: {hpValueNode.InnerText.Trim()}");
}

注意事项

  • 使用InnerText.Trim()避免文本中的空白字符影响匹配结果
  • 用FirstOrDefault()替代Where(),直接获取第一个匹配的节点,避免处理枚举器
  • 对节点做非空判断,防止页面结构变化导致空引用异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:01:01