HtmlAgilityPack - 解析 table 并将行分配给自定义模型

HtmlAgilityPack - Parse table and assign rows to custom model

所以我正在尝试抓取一些网站数据(特别是第一个 table here)。我正在使用 table xpath,并试图获取分配给我模型的特定行数据。

public static async Task<List<SuspensionModel>> GetSuspensionData()
{
    var htmlDocument = new HtmlDocument();

    var httpResponseMessage = await _httpClient.GetAsync(_2020SuspUrl);
    await EnsureSuccessStatusCode(httpResponseMessage);
    var SuspStatsAsHtml = await httpResponseMessage.Content.ReadAsStringAsync();
    htmlDocument.LoadHtml(SuspStatsAsHtml);

    var suspData = ParseTable(htmlDocument, "/html/body/div[3]/div[3]/div[5]/div[1]/table[1]/tbody/tr");

    //return ;
}

private static List<SuspensionModel> ParseTable(HtmlDocument htmlDocument, string xPath)
{
    var returnData = new List<SuspensionModel>();
    foreach (HtmlNode row in htmlDocument.DocumentNode.SelectNodes(xPath))
    {
        HtmlNodeCollection cells = row.SelectNodes("td");
        var arr = new String[7];
        for (int i = 0; i < cells.Count; ++i)
        {
            arr[i] = cells[i].InnerText;
        }

        var susp = new SuspensionModel
        {
            IncidentDate = DateTime.Parse(arr[0]),
            OffenderName = arr[1],
            OffenderTeam = arr[2],
            OffenseDesc = arr[3],
            ActionDate = DateTime.Parse(arr[4]),
            OffenseLength = arr[5],
            SalaryLoss = int.Parse(arr[6])
        };

        returnData.Add(susp);
    }
    return returnData;
}

在我的 ParseTable 方法中,我在模型中赋值,如何访问给定行中的特定单元格数据?基本上,我想做类似的事情: foreach row, step through each cell and assign to the correct model value。正如我现在所拥有的,我的 cells 变量始终 returns 为空,所以我假设我没有正确使用 HtmlAgilityPack

在此感谢任何帮助!

我最终解决了这个问题。我遗漏了两件事,事实证明它与 HtmlAgilityPack 无关。

  1. 我需要将 .Skip(1) 添加到我的 foreach 行,以便它跳过 table header 行。
foreach (HtmlNode row in htmlDocument.DocumentNode.SelectNodes(xPath).Skip(1))
  1. 我需要修复我的 SalaryLoss 值。我将其指定为 int,但我需要将其更改为 double,因为它是货币值。
SalaryLoss = double.Parse(arr[6], System.Globalization.NumberStyles.Currency)