C# 使用HtmlAgilityPack、嵌套列表和Linq
要过滤职业统计表的数据,可以使用LINQ方法。然后,过滤后的数据可用于使用LINQ方法创建CareerProperty对象列表 以下是我们如何获得所选季节ID和注册的职业统计数据:C# 使用HtmlAgilityPack、嵌套列表和Linq,c#,linq,html-agility-pack,C#,Linq,Html Agility Pack,要过滤职业统计表的数据,可以使用LINQ方法。然后,过滤后的数据可用于使用LINQ方法创建CareerProperty对象列表 以下是我们如何获得所选季节ID和注册的职业统计数据: 要过滤职业统计表的数据,可以使用LINQ方法。然后,过滤后的数据可用于使用LINQ方法创建CareerProperty对象列表 以下是我们如何获得所选季节ID和注册的职业统计数据: 请您添加下一个信息:1。要应用于表的每一行的过滤器,例如S16和Pre;2.添加CareerProperties类并描述如何将td项目映
要过滤职业统计表的数据,可以使用LINQ方法。然后,过滤后的数据可用于使用LINQ方法创建CareerProperty对象列表 以下是我们如何获得所选季节ID和注册的职业统计数据:
请您添加下一个信息:1。要应用于表的每一行的过滤器,例如S16和Pre;2.添加CareerProperties类并描述如何将td项目映射到此类的属性?我可以添加我如何使用foreach进行映射,对于我尝试映射的td映射,例如:季节到CareerProperties季节,因此在我的应用程序的下一部分中,我可以进行data.Season。请添加下一个信息:1。要应用于表的每一行的过滤器,例如S16和Pre;2.添加CareerProperties类并描述如何将td项映射到此类的属性?我可以添加我如何使用foreach进行映射,对于我尝试映射的td映射,例如:季节到CareerProperties季节,因此在我的应用程序的下一部分中,我可以执行data.seasure.Hey,Iliar我在使用此项进行类似操作时遇到问题。该表中间有一个THAD,它导致Syr.AgUMutOutOfRangeExtExc:索引超出范围错误。你介意再次帮我找出如何修复它吗?这是一张表:无论我做什么,当LINQ语句到达表中的第二个thead时,它都会出错。下面是一个声明,我不知道如何跳过第二个“thead”或其他方法。谢谢。尝试替换下一个代码。选择singlenode/*@id='content']/div/div/div[3]/div/div/div/div/div[2]/table.degenantstr.Skip2替换下一个代码。选择nodes/*[@id='content']/div/div/div/div[3]/div/div/div/div/div/div/div/div/div/2]/table/tbody/tr.Xpath/*[@id='content'],Iliar我在用这个做类似的事情时遇到了一个问题。该表中间有一个THAD,它导致Syr.AgUMutOutOfRangeExtExc:索引超出范围错误。你介意再次帮我找出如何修复它吗?这是一张表:无论我做什么,当LINQ语句到达表中的第二个thead时,它都会出错。下面是一个声明,我不知道如何跳过第二个“thead”或其他方法。谢谢。尝试替换下一个代码。选择singlenode/*@id='content']/div/div/div[3]/div/div/div/div/div[2]/table.degenantstr.Skip2替换下一个代码。选择nodes/*[@id='content']/div/div/div/div[3]/div/div/div/div/div/div/div/div/div/2]/table/tbody/tr.Xpath/*[@id='content']。
List<List<string>> table = playerDoc.DocumentNode
.SelectSingleNode($"//*[@id='lg_team_user_leagues-{leagueId}']/div[4]/table/tbody")
.Descendants("tr")
.Skip(1)
.Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
.ToList();
foreach (var careerStats in findCareerNode)
{
if (careerStats
.SelectSingleNode($"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[1]").InnerText.Trim() != seasonId)
{
index++;
continue;
}
else if (careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[2]")
.InnerText.Trim() != "Reg")
{
index++;
continue;
}
var type = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[2]")
.InnerText;
var record = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[3]")
.InnerText;
var amr = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[4]")
.InnerText ?? "0.0";
var goals = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[5]")
.InnerText;
var assists = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[6]")
.InnerText;
var sot = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[7]")
.InnerText;
var shots = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[8]")
.InnerText;
var passC = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[9]")
.InnerText;
var passA = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[10]")
.InnerText;
var keypass = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[11]")
.InnerText;
var interceptions = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[12]")
.InnerText;
var tac = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[13]")
.InnerText;
var tacA = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[14]")
.InnerText;
var blk = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[15]")
.InnerText;
var rc = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[16]")
.InnerText;
var yc = careerStats
.SelectSingleNode(
$"//*[@id='lg_team_user_leagues-{leagueId}']/div[{div}]/table/tbody/tr[{index}]/td[17]")
.InnerText;
...
}
// Now the return type is a List of CareerProperties.
List<CareerProperties> table = playerDoc.DocumentNode
.SelectSingleNode($"//*[@id='lg_team_user_leagues-{leagueId}']/div[4]/table/tbody")
.Descendants("tr")
.Skip(1)
// Up to here is your code. Here you select all rows from the table.
// Each row is presented as List<string>.
.Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
// Here we filter table rows by "seasonId" and "Reg".
.Where(tr => tr[0] == seasonId && tr[1] == "Reg")
// Here we create objects CareerProperties from filtered rows.
.Select(tr => new CareerProperties
{
Type = tr[2],
Record = tr[3],
Amr = tr[4],
Goals = tr[5]
Assists = tr[6],
// Fill other properties.
...
})
.ToList();