C# 使用LINQ和HtmlAgilityPack解析表
如何在网页上使用LINQ解析HTML以从表中获取C# 使用LINQ和HtmlAgilityPack解析表,c#,linq,html-agility-pack,C#,Linq,Html Agility Pack,如何在网页上使用LINQ解析HTML以从表中获取innerhtml值 我正在使用HtmlAgilityPack,希望尽可能好地解析一些值 您看到的号码(00000、00001、00002..)是来自代理的唯一号码 因此,也许有一种方法可以使用LINQ解析这些数字,并从td的 (姓名、123、州和信息)=>00000、约翰、123、空闲、每人一杯咖啡 所以我可以分别调用它们并与它们一起工作-也许是在一个数组中 </TH> </TR> <TR ALIGN
innerhtml
值
我正在使用HtmlAgilityPack
,希望尽可能好地解析一些值
您看到的号码(00000、00001、00002..)是来自代理的唯一号码
因此,也许有一种方法可以使用LINQ解析这些数字,并从td的
(姓名、123、州和信息)=>00000、约翰、123、空闲、每人一杯咖啡
所以我可以分别调用它们并与它们一起工作-也许是在一个数组中
</TH>
</TR>
<TR ALIGN=RIGHT>
<TD ALIGN=LEFT>00000</TD>
<TD ALIGN=LEFT>John</TD>
<TD ALIGN=CENTER>123</TD>
<TD ALIGN=LEFT>IDLE</TD>
<TD ALIGN=LEFT>coffee</TD>
</TR>
<TR ALIGN=RIGHT>
<TD ALIGN=LEFT>00001</TD>
<TD ALIGN=LEFT>Lisa</TD>
<TD ALIGN=CENTER>123</TD>
<TD ALIGN=LEFT>IDLE</TD>
<TD ALIGN=LEFT>coffee</TD>
</TR>
<TR ALIGN=RIGHT>
<TD ALIGN=LEFT>00002</TD>
<TD ALIGN=LEFT>Mary</TD>
<TD ALIGN=CENTER>123</TD>
<TD ALIGN=LEFT>IDLE</TD>
<TD ALIGN=LEFT>coffee</TD>
</TR>
<TR ALIGN=RIGHT>
<TD ALIGN=LEFT>00003</TD>
<TD ALIGN=LEFT>Tim</TD>
<TD ALIGN=CENTER>123</TD>
<TD ALIGN=LEFT>IDLE</TD>
<TD ALIGN=LEFT>coffee</TD>
</TR>
....
00000
约翰
123
闲置的
咖啡
00001
丽莎
123
闲置的
咖啡
00002
玛丽
123
闲置的
咖啡
00003
提姆
123
闲置的
咖啡
....
提前谢谢 这看起来很像“请给我我需要的代码问题”,这是我非常不喜欢的。请查看以下内容并确保您理解:
var doc = ... // Load the document
var trs = doc.DocumentNode.Descendants("TR"); // Give you all the TRs
foreach (var tr in trs)
{
var tds = tr.Descendants("TD").ToArray(); // Get all the TDs
// Turn them into our datastructure
var data = new {
Name = tds[1].InnerText,
Number = tds[2].InnerText,
State = tds[3].InnerText,
Info = tds[4].InnerText,
};
// Do something with data
}
仅使用LINQ执行此操作:
var data = from tr in doc.DocumentNode.Descendants("TR")
let tds = tr.Descendants("TD").ToArray()
select new {
Name = tds[1].InnerText,
Number = tds[2].InnerText,
State = tds[3].InnerText,
Info = tds[4].InnerText,
};
@flindeberg给出了一个非常合理的答案(+1对他/她),你可以避免像这样的
ToArray
private class Row
{
public string Name { get; set; }
public int Number { get; set; }
public string State { get; set; }
public string Info { get; set; }
}
var映射=新操作[]
{
(值,行)=>行。名称=值,
(值,行)=>row.Number=int.Parse(值),
(值,行)=>行。状态=值,
(值,行)=>row.Info=value
};
var doc=…//加载文档
var trs=doc.DocumentNode.substands(“TR”);//给你所有的TRs
foreach(trs中的var tr)
{
var row=新行();
tr.TD.Zip(映射,(TD,map)=>
{
地图(td.InnerText,行);
返回true;
});
//您现在有了一个填充的行。
}
这里有一个答案和一个例子:
var mappings = new Action<string, Row>[]
{
(value, row) => row.Name = value,
(value, row) => row.Number = int.Parse(value),
(value, row) => row.State = value,
(value, row) => row.Info = value
};
var doc = ... // Load the document
var trs = doc.DocumentNode.Descendants("TR"); // Give you all the TRs
foreach (var tr in trs)
{
var row = new Row();
tr.Descendants("TD").Zip(mappings, (td, map) =>
{
map(td.InnerText, row);
return true;
});
// You now have a populated row.
}