我正在使用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"))
如何确保我抓取的数据仅来自第一张表?
感谢。
答案 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。