Vb.net 使用HtmlAlityPack统计具有子表的Html表中的行和列
我正在解析一个Html表,我需要列和行计数 我尝试使用:Vb.net 使用HtmlAlityPack统计具有子表的Html表中的行和列,vb.net,html-table,html-agility-pack,Vb.net,Html Table,Html Agility Pack,我正在解析一个Html表,我需要列和行计数 我尝试使用: ColNum = mTables(1).SelectNodes(".//th").Count RowNum = mTables(1).SelectNodes(".//tr").Count 但若表中有一个或多个子表,我会得到错误的结果 下面是我需要解析的html表示例: <table border='1'> <tbody> <tr><th>Some Text</
ColNum = mTables(1).SelectNodes(".//th").Count
RowNum = mTables(1).SelectNodes(".//tr").Count
但若表中有一个或多个子表,我会得到错误的结果
下面是我需要解析的html表示例:
<table border='1'>
<tbody>
<tr><th>Some Text</th><th>Some Text</th><th>Some Text</th></tr>
<tr><td>Some data</td><td>Some data</td><td>Some data</td></tr>
<tr><td>Some data</td><td>Some data
<table border='1'>
<tbody>
<tr><th>Some Text</th><th>Some Text</th></tr>
<tr><td>Some Data</td><td>Some Data</td></tr>
</tbody>
</table><td>Some data</td></tr>
<tr><td>Some data</td><td>Some data</td><td>Some data</td></tr>
<tr><td>Some data</td><td>Some data</td><td>Some data</td></tr>
</tbody>
</table>
一些文本一些文本一些文本
一些数据一些数据
一些数据集数据
一些文本一些文本
一些数据集数据
一些数据
一些数据一些数据
一些数据一些数据
在此示例中,我需要以下结果:
列=3
行数=5
如何在不计算子表的行和列的情况下获得行和列的数量(仅针对主表)?我使用ScrapySharp nuget包启用Css选择器,得到了正确的结果。(在使用HtmlAgilityPack时,我经常使用ScrapySharp) 使用ScrapySharp.Extensions添加
编辑器中.vb文档顶部的代码>
HtmlDocument d = new HtmlDocument();
string s = @"
<table border='1'>
<tbody>
<tr>
<th>Some Text</th>
<th>Some Text</th>
<th>Some Text</th>
</tr>
<tr><td>Some data</td><td>Some data</td><td>Some data</td></tr>
<td>Some data</td><td>Some data
<table border='1'>
<tbody>
<tr>
<th>Some Text</th>
<th>Some Text</th>
</tr>
<tr><td>Some Data</td><td>Some Data</td></tr>
</tbody>
</table><td>Some data</td></tr>
<tr><td>Some data</td><td>Some data</td><td>Some data</td></tr>
<tr><td>Some data</td><td>Some data</td><td>Some data</td></tr>
</tbody>
</table>";
d.LoadHtml(s);
var node = d.DocumentNode;
var outerTable = node.CssSelect("tbody tr").FirstOrDefault();
if (outerTable != null)
{
var ths = outerTable.SelectNodes("th");
Console.WriteLine(ths.Count());
}
}
HtmlDocument d=新的HtmlDocument();
字符串s=@“
一些文本
一些文本
一些文本
一些数据一些数据
一些数据集数据
一些文本
一些文本
一些数据集数据
一些数据
一些数据一些数据
一些数据一些数据
";
d、 加载HTML(s);
var节点=d.DocumentNode;
var outerTable=node.CssSelect(“tbody tr”).FirstOrDefault();
if(outerTable!=null)
{
var ths=可外接。选择节点(“th”);
Console.WriteLine(th.Count());
}
}
因为您只需要第一个表的ths,所以我使用的css选择器是tbody tr
,它将返回3个匹配项,但我们只需要第一个tr。(我可以在这里使用css伪选择器:首先在一行语句中实现这一点,但ScrapySharp不支持伪选择器)
输出3我用这种方法求解:
对于列:
ColNum = mTables(1).SelectSingleNode(".//tbody//tr[1]").SelectNodes(".//th").Count
对于行:
首先:检查子表
Dim SubTbl%
Try
SubTbl% = mTables(1).SelectNodes(".//table").Count
Catch ex As Exception
SubTbl% = 0
End Try
然后:计算子表中的行数并从总行数中减去
Dim SubTRows% = 0
If SubTables > 0 Then
For SubT As Short = 1 To SubTables
Dim STRows% = mTables(1).SelectNodes(".//table[" & SubT & "]//tr").Count
SubTRows += STRows
Next
RowsNum = mTables(1).SelectNodes(".//tr").Count - SubTRows
Else
RowsNum = mTables(1).SelectNodes(".//tr").Count
End If
你得到的错误结果是什么?预期结果是什么(2?)@Veverke我只需要计算主表。结果是(主表列)+(子表列)和(主表行)+(子表行)。我将编辑问题,以便您只计算外部表格中的th?我使用的是vb.net。当您说“使用ScrapySharp.Extensions添加”时,您的意思是导入ScrapySharp.Extensions
?以及如何在vb.net中声明ths
?首先,我更新了我的解决方案-现在它返回3。关于ScrapySharp,它是一个nuget软件包,您可以在Visual Studio的PackageManager控制台窗口中运行安装软件包ScrapySharp
来安装它。感谢您的帮助:您为我提供了解决方案的spark;)+1如果您事先知道只需要第一个表的第一个tr,为什么要减去不相关的tr:)?这就是我的解决方案的基础。@Veverke我不知道如何才能只计算主表的行数。在所有的测试中,我得到了所有的行,所以我想减去子表的行。您给了我一些有用的提示,我也不知道如何使用xpath选择。这就是我建议将ScrapySharp添加到项目中的原因,这样您就可以使用Css选择器,并为“table tr”选择,只获取第一个元素。似乎您没有成功安装/使用ScrapySharp。@Veverke我是为列安装的,但不是为行安装的。我在安装HAP时遇到了很多问题,所以我害怕安装和使用另一个软件包(我不是专业人士)