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

使用HtmlAgilityPack筛选游戏岛屿数据无输出问题求助

问题排查:浏览器游戏岛屿筛选VB.NET代码无输出问题

问题背景

需筛选100×100地图中矿洞类型为tradegood2、已占用槽位≤7的岛屿,按矿洞等级、木工等级降序排列,输出格式如「Island [71:92] mine : lvl 16 carpentry : lvl 20 free slots: 9」,但现有VB.NET代码点击按钮后无任何输出。


核心错误点排查

1. HTML文件加载路径问题

代码直接加载pastebin.html,若文件不在程序运行目录(如Debug/Release文件夹),HtmlDocument会加载失败,后续所有节点查询返回空。需确保文件路径正确,或改用LoadHtml直接加载HTML字符串。

2. 贸易品类型判断逻辑缺陷

原代码通过tradeGoodType <> "tradegood tradegood2"判断,但若class属性顺序调换(如tradegood2 tradegood)或包含其他类名,会误过滤目标岛屿。正确逻辑应检查class是否包含tradegood2,而非完全匹配字符串。

3. 矿洞等级节点选择错误

原代码用//div[contains(@class, 'tradegood2')]/span,但tradegood2是tradegood节点的子类,正确XPath应为.//div[contains(@class, 'tradegood') and contains(@class, 'tradegood2')]/span,避免误匹配其他带tradegood2的节点。

4. 已占用槽位查询冗余

原代码用.//div[contains(@class, 'cities')]/text(),直接取节点InnerText即可,/text()会导致文本周围有空格时查询失败。

5. 输出方式不易察觉

Debug.Print仅在Visual Studio输出窗口显示,编译后运行无法看到结果,需改用窗体控件(如TextBox)或弹窗展示。


修正后的完整代码

Imports System.IO
Imports HtmlAgilityPack

Public Class Form1
    Public Class Island
        Public Property Coord As String
        Public Property MineLevel As Integer
        Public Property CarpentryLevel As Integer
        Public Property FreeSlots As Integer
    End Class

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim htmlDoc As New HtmlAgilityPack.HtmlDocument()
        ' 处理文件加载异常,确保路径正确
        Try
            htmlDoc.Load("pastebin.html") ' 若路径不确定,建议改用绝对路径
        Catch ex As Exception
            MessageBox.Show("HTML文件加载失败:" & ex.Message)
            Return
        End If

        Dim islands As New List(Of Island)()
        ' 先判断是否存在岛屿节点,避免空引用
        Dim tileNodes = htmlDoc.DocumentNode.SelectNodes("//div[contains(@class, 'islandTile') and not(contains(@class, 'oceanTile')) and starts-with(@id, 'tile_')]")
        If tileNodes Is Nothing Then
            MessageBox.Show("未找到任何岛屿节点")
            Return
        End If

        For Each tile As HtmlNode In tileNodes
            ' 精准匹配tradegood2类型矿洞
            Dim tradeGoodNode = tile.SelectSingleNode(".//div[contains(@class, 'tradegood') and contains(@class, 'tradegood2')]")
            If tradeGoodNode Is Nothing Then
                Continue For
            End If

            ' 提取矿洞等级(处理空节点)
            Dim mineLevel As Integer
            Dim mineSpan = tradeGoodNode.SelectSingleNode("./span")
            If mineSpan IsNot Nothing Then
                Integer.TryParse(mineSpan.InnerText.Trim(), mineLevel)
            End If

            ' 提取木工等级(处理空节点)
            Dim carpentryLevel As Integer
            Dim carpentrySpan = tile.SelectSingleNode(".//div[contains(@class, 'ikaeasy-resource-wood')]/span")
            If carpentrySpan IsNot Nothing Then
                Integer.TryParse(carpentrySpan.InnerText.Trim(), carpentryLevel)
            End If

            ' 提取已占用槽位(处理空节点)
            Dim occupiedSlots As Integer
            Dim citiesNode = tile.SelectSingleNode(".//div[contains(@class, 'cities')]")
            If citiesNode IsNot Nothing Then
                Integer.TryParse(citiesNode.InnerText.Trim(), occupiedSlots)
            End If

            ' 筛选符合槽位条件的岛屿
            If occupiedSlots <= 7 Then
                ' 提取坐标部分(如从"Nyeos [71:92]"中获取"[71:92]")
                Dim coordMatch = System.Text.RegularExpressions.Regex.Match(tile.GetAttributeValue("title", ""), "\[\d+:\d+\]")
                Dim coordText = If(coordMatch.Success, coordMatch.Value, "未知坐标")

                islands.Add(New Island With {
                    .Coord = coordText,
                    .MineLevel = mineLevel,
                    .CarpentryLevel = carpentryLevel,
                    .FreeSlots = 16 - occupiedSlots
                })
            End If
        Next

        ' 按要求排序
        islands = islands.OrderByDescending(Function(i) i.MineLevel).ThenByDescending(Function(i) i.CarpentryLevel).ToList()

        ' 输出到窗体TextBox(需先添加MultiLine=True的TextBox控件,命名为txtResult)
        txtResult.Clear()
        If islands.Count = 0 Then
            txtResult.Text = "未找到符合条件的岛屿"
        Else
            For Each island In islands
                txtResult.AppendText($"Island {island.Coord} mine: lvl {island.MineLevel} carpentry: lvl {island.CarpentryLevel} free slots: {island.FreeSlots}" & vbCrLf)
            Next
        End If
    End Sub
End Class

优化说明

  • 添加文件加载异常捕获,快速定位路径问题
  • 所有节点查询添加空值判断,避免空引用崩溃
  • 用正则提取坐标部分,严格匹配输出格式要求
  • 将输出改为窗体TextBox展示,直观可见结果
  • 对文本调用Trim(),避免空格导致的数值解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 06:27:54