C# HtmlAlityPack-检测空白表?
我正在使用c和htmlagilitypack。除了我要查找的表不包含任何行之外,其他一切都正常。我试图只读取页面上第一个表中的数据。问题是,如果第一个表不包含行,HtmlAlityPack出于某种原因似乎会跳到第二个表 我试图阅读的html如下所示:C# HtmlAlityPack-检测空白表?,c#,html-agility-pack,C#,Html Agility Pack,我正在使用c和htmlagilitypack。除了我要查找的表不包含任何行之外,其他一切都正常。我试图只读取页面上第一个表中的数据。问题是,如果第一个表不包含行,HtmlAlityPack出于某种原因似乎会跳到第二个表 我试图阅读的html如下所示: <table class='stats'> <tr> <td colspan='2'>This is the 1st table</td> <tr>
<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>
如何确保我获取的数据仅来自第一个表
谢谢。您需要在表或行上有一个唯一标识该表的id,然后在xpath中使用该id。您可以通过在表选择器之后使用位置索引[1]确保只选择第一个匹配表 请尝试以下操作:
"//table[@class='stats'][1]/tr[position()>2]/td"
var elements = root.SelectNodes("//table[@class='stats'][1]/tr[position()>2]/td");
if (elements != null)
{
foreach (HtmlNode node in elements)
{
// process the td node
}
}
如果第一个表没有行,那么您将返回null,因此您应该在foreach中迭代之前检查它
例如,您可能希望执行以下操作:
"//table[@class='stats'][1]/tr[position()>2]/td"
var elements = root.SelectNodes("//table[@class='stats'][1]/tr[position()>2]/td");
if (elements != null)
{
foreach (HtmlNode node in elements)
{
// process the td node
}
}
是的,我认为我的问题似乎是因为我正在读取的表没有与其关联的id。我尝试运行了一些测试,并意识到当我指定[@class='stats']/tr[position>2]时,它将返回每个表的第2行之后的所有stats类表的所有行。因此,我的原始示例返回两行值A |值B…和值111 |值222。如果表1中没有行,它只返回值111 |值222。它似乎不在乎它来自哪张桌子@克里斯Taylor@goalie35为什么我被否决了?我认为你发表的评论是错误的,因为你的评论是针对Chirs Taylor的。我道歉。这一次已经有一段时间了,但我看不出为什么这一次应该被否决。也许是错了,谢谢你的回复。不幸的是,这不起作用。这似乎是一个没有指定表id的问题。您能提供一个示例HTML来说明这个问题吗?我使用您问题中的示例进行了测试,并从第一个表中删除了s,SelectNodes为null,这是我理解您需要的。实际代码长于此处允许的字符总数,因此我正在尝试阅读此页面。这是第一张有class='statstable'的桌子,大约在页面的一半。第一个名为“季节统计”的表包含2个标题行,但没有数据行,这就是我遇到问题的地方。我需要能够确定何时不存在数据行:再次感谢。@user1070194,我已经快速查看了您提供的URL,我能说的是HTML是非常有害的!找不到合适的xpath查询的原因是,HAP似乎与所有相互嵌套且没有结束标记的和混淆了。IE开发者工具栏和FireBug都对生成的DOM进行了不同的解释,尽管它呈现的很好。