HTMLAgilityPack:需要提取colspan值和其他

时间:2014-01-13 19:09:43

标签: c# html html-agility-pack

我正试图从互联网上的时间表中读取。

这是html代码的一部分:

<TR>
    <TD rowspan=12 align="center" nowrap="1">
        <TABLE>
            <TR>
                <TD align="center" nowrap=1><font size="3" face="Arial"><B>Monday</B></font> 
                </TD>
            </TR>
        </TABLE>
    </TD>
    <TD colspan=2 rowspan=12 align="center" nowrap="1">
        <TABLE>
            <TR>
                <TD>
                </TD>
            </TR>
        </TABLE>
    </TD>
    <TD colspan=6 rowspan=12 align="center" nowrap="1">
        <TABLE>
            <TR>
                <TD width="33%" nowrap=1><font size="2" face="Arial"><B>Meeting</B></font></TD>
            </TR>
            <TR>
                <TD width="33%" nowrap=1><font size="2" face="Arial"><B>London</B></font></TD>
                <TD width="33%" nowrap=1><font size="2" face="Arial">Smith</font></TD>
            </TR>
        </TABLE>
    </TD>
    <TD colspan=4 rowspan=12 align="center" nowrap="1">

我设法安装HTMLAgilityPack并立即实现此代码。到目前为止,后代和跳过似乎还不错:

List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table[@border='3']")
                    .Descendants("tr") 
                    .Skip(1)  
                    .Where(tr => tr.Elements("td").Count() >= 4)
                    .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                    .ToList();

表的结果是这样的:

  • [0] =“星期一”
  • [1] =“”
  • [2] =“Meeting \ r \ n \ r \ n \ r \ n伦敦\ r \ n \ r \ n \ r \ nSmith”
  • [3] =“”
  • [4] = ......另一次会议......

colspan值表示持续时间。所以我的问题是:

如何将colspan的值作为结果的一部分?我需要知道,伦敦会议在2个单位后开始,持续6个单位。

  • [0] =“星期一”
  • [1] =“”//休息时间为2
  • [2] =“Meeting \ r \ n \ r \ n \ r \ n伦敦\ r \ n \ r \ n \ r \ nSmith”//持续时间为6

谢谢!

1 个答案:

答案 0 :(得分:3)

以匿名方式捕获它可能是最简单的:

 var table = doc.DocumentNode.SelectSingleNode("//table[@border='3']")
                .Descendants("tr") 
                .Skip(1)  
                .Where(tr => tr.Elements("td").Count() >= 4)
                .Select(tr => tr.Elements("td")
                    .Select(td => new { Text = td.InnerText.Trim(), Duration = td.Attributes["Colspan"] != null ? td.Attributes["Colspan"].Value: "1").ToList())
                .ToList();

或者创建一个元组的实例:

 List<List<Tuple<string, string>> table = doc.DocumentNode.SelectSingleNode("//table[@border='3']")
                .Descendants("tr") 
                .Skip(1)  
                .Where(tr => tr.Elements("td").Count() >= 4)
                .Select(tr => tr.Elements("td")
                    .Select(td => new Tuple<string,string>(td.InnerText.Trim(),  td.Attributes["Colspan"] != null ? td.Attributes["Colspan"].Value: "1").ToList())
                .ToList();