【问题标题】:HtmlAgilityPack - Parse table and assign rows to custom modelHtmlAgilityPack - 解析表并将行分配给自定义模型
【发布时间】:2021-09-09 08:00:45
【问题描述】:

所以我试图抓取一些网站数据(特别是第一个表here)。我正在使用表 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 变量总是返回 null,所以我假设我没有正确使用 HtmlAgilityPack

感谢您的帮助!

【问题讨论】:

    标签: c# html-parsing html-agility-pack


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多