Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用HtmlAlityPack统计具有子表的Html表中的行和列_Vb.net_Html Table_Html Agility Pack - Fatal编程技术网

Vb.net 使用HtmlAlityPack统计具有子表的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</

我正在解析一个Html表,我需要列和行计数

我尝试使用:

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添加

            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时遇到了很多问题,所以我害怕安装和使用另一个软件包(我不是专业人士)