HTMLAgilityPack - 检测空白表?

时间:2012-02-07 17:07:34

标签: c# html-agility-pack

我正在使用c#和htmlagilitypack。一切正常,除非我正在寻找的表不包含任何行。我正在尝试只读取页面上第一个表格中的数据。问题是如果第一个表不包含任何行,htmlagilitypack似乎由于某种原因跳转到第二个表。

我想读的html看起来像这样:

<table class='stats'>
    <tr>
      <td colspan='2'>This is the 1st table</td>
    <tr>
      <td>Column A</td>
      <td>Column B</td>
    </tr>
    <tr>
      <td>Value A</td>
      <td>Value B</td>
    </tr>
</table>

<table class='stats'>
    <tr>
      <td colspan='2'>This is the 2nd table</td>
    <tr>
      <td>Column 1</td>
      <td>Column 2</td>
    </tr>
    <tr>
      <td>Value 111</td>
      <td>Value 222</td>
    </tr>
</table>

然后我使用以下行检索第一个表的值:

foreach (HtmlNode node in root.SelectNodes("//table[@class='stats']/tr[position() > 2]/td"))

如何确保我抓取的数据仅来自第一张表?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以确保只使用表格选择器后面的位置索引[1]来选择第一个匹配的表格。

尝试以下方法:

"//table[@class='stats'][1]/tr[position()>2]/td"

如果第一个表没有行,那么您将返回null,因此您应该在迭代foreach之前检查它。

例如,您可能希望执行以下操作:

var elements = root.SelectNodes("//table[@class='stats'][1]/tr[position()>2]/td");
if (elements != null)
{
  foreach (HtmlNode node in elements)
  {
    // process the td node
  }
}

答案 1 :(得分:0)

您需要在表或行上具有唯一标识表的id或or,然后在xpath中使用id。