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 无关。
- 我需要将 .Skip(1) 添加到我的 foreach 行,以便它跳过 table header 行。
foreach (HtmlNode row in htmlDocument.DocumentNode.SelectNodes(xPath).Skip(1))
- 我需要修复我的 SalaryLoss 值。我将其指定为 int,但我需要将其更改为 double,因为它是货币值。
SalaryLoss = double.Parse(arr[6], System.Globalization.NumberStyles.Currency)
所以我正在尝试抓取一些网站数据(特别是第一个 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 无关。
- 我需要将 .Skip(1) 添加到我的 foreach 行,以便它跳过 table header 行。
foreach (HtmlNode row in htmlDocument.DocumentNode.SelectNodes(xPath).Skip(1))
- 我需要修复我的 SalaryLoss 值。我将其指定为 int,但我需要将其更改为 double,因为它是货币值。
SalaryLoss = double.Parse(arr[6], System.Globalization.NumberStyles.Currency)