C# 使用Html Agility Pack获取特定表

C# 使用Html Agility Pack获取特定表,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,我在使用HTML Agility Pack获取某些特定表时遇到问题。我也不能更改实际的HTML,所以我不能使用其他ID、类或任何东西 有人能告诉我如何访问下面的每个表吗 <table class="newTable"> //table 1 contents <table border="0" cellpadding="3" cellspacing="2" width="100%"> //table 1 - A contents

我在使用HTML Agility Pack获取某些特定表时遇到问题。我也不能更改实际的HTML,所以我不能使用其他ID、类或任何东西

有人能告诉我如何访问下面的每个表吗

<table class="newTable">
      //table 1 contents
    <table border="0" cellpadding="3" cellspacing="2" width="100%">
         //table 1 - A contents
    </table>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="newTable">
     //table 2 contents
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
        //table 2 - A contents
    </table>
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
       //table 2 - B contents
    </table>
    <table width="100%" cellspacing="2" cellpadding="0">
       //table 2 - C contents
    </table>
</table>
<table>
     //table 3 contents
</table>
我会经历所有的事情。我希望能够以不同的方式访问表,以关联存储数据的位置

我试过看像这样的东西

doc.DocumentNode.SelectNodes(//表[1]”;

但是使用索引似乎不起作用,当我试图用它指定一个表时,它仍然读取所有表,或者不读取任何表

同样的道理也适用于此,它要么根本不起作用,要么得到了一切

foreach (var cell in table.SelectNodes("//table").Skip(some_number))
{
     string someVariable = cell.InnerText
}
我使用的是HTML Agility Pack 1.4.9的NuGet包

编辑:

我试图只获取表1-A的内容。两者都给出null或endcodingfound异常

HtmlNode table=doc.DocumentNode.SelectSingleNode(“//table/tr/td/table[1]”;


HtmlNode table=doc.DocumentNode.SelectSingleNode(“//table[1]/tr/td/table[1]”;

错误在于第二次调用“//tr/td”“将返回到根元素。对于问题的第一部分,您的索引器是正确的解决方案,第二部分可以通过指定您要从所在位置导航来修复:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]");
foreach (var cell in table.SelectNodes(".//tr/td")) // **notice the .**
{
     string someVariable = cell.InnerText
}
我不知道还有什么其他的事情,但是,下面的内容在我的测试中很有用。这可能意味着您需要分享更多的上下文

这是我用于测试的文档:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <table class="newTable">
        <tr>
            <td>
                <table border="0" cellpadding="3" cellspacing="2" width="100%">
                    <tr><td>
                        //table 1 - A contents
                    </td></tr>
                </table>
            </td>
        </tr>

    </table>
    <table border="0" cellpadding="0" cellspacing="0" class="newTable">
        <tr>
            <td>
                //table 2 contents
                <table width="100%" border="0" cellspacing="2" cellpadding="0">
                    <tr>
                        <td>
                            //table 2 - A contents
                        </td>
                    </tr>
                </table>
                <table width="100%" border="0" cellspacing="2" cellpadding="0">
                    <tr>
                        <td>
                            //table 2 - B contents
                        </td>
                    </tr>
                </table>
                <table width="100%" cellspacing="2" cellpadding="0">
                    <tr>
                        <td>
                            //table 2 - C contents
                        </td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>
    <table>
        <tr>
            <td>
                //table 3 contents
            </td>
        </tr>
    </table>
</body>
</html>
显示:

更新 好的,我得到了你的实际HTML,我也得到了一个空引用。一定有什么东西让敏捷包非常困惑,不知道为什么。虽然Linq API的一些实验似乎有效,但我希望它可以作为您的替代方案:

var table = doc.DocumentNode.DescendantsAndSelf("table").Skip(1).First().Descendants("table").First();
var tds   = table.Descendants("td");

所以,当我说上面的例子时,它是有效的。然而,如果我说
table[2]
例如,Agility get是一个
NullReference
。。。我不知道这是为什么。我也不确定
表[2]
指向什么。在我上面的例子中,
表[2]
指向
//表2目录
,或者它试图在
//表1目录
中找到第二个子表。你能给我看一个关于如何访问子表的附加示例,而不是像我上面的示例中那样的主表吗。我对导航如何实现索引专用性感到困惑。我添加了两个示例,说明如何获取表1-A的内容。由于当前数据包含业务信息,我可以尝试构建一个模拟副本。但我在上面发布的是表格的精确布局。除了每个表本身有各种td和tr之外。我只需要帮助从我选择的特定表中获取数据。i、 e.只有表1-A,或者只有表2-C。太棒了!这太棒了!一个简单的问题,如果我只想得到表1的内容,而不是任何子表,比如表1-A,该怎么办?我尝试了这个
“//tr[not(.//td[@colspan='3'])]/td[not(.//table)]”
,它跳过了带有
colspan=3
的td,但它仍然进入了表1的表-aeexcellent!非常感谢。不幸的是,
.SelectSingleNode(//表[2])
始终使用
nullreference异常保持错误状态
,我在我的示例中使用了上面的确切结构,因此idk为什么找不到索引…,//表[1]也不起作用,我只选择了一个表:(涉及到一些
。下面是表2的样子。我正在尝试获取表2-a:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);

var node1A = doc.DocumentNode.SelectSingleNode("//table[1]//table[1]");
string content1A = node1A.InnerText;
Console.WriteLine(content1A);

var node2C = doc.DocumentNode.SelectSingleNode("//table[2]//table[3]");
string content2C = node2C.InnerText;
Console.WriteLine(content2C);
var table = doc.DocumentNode.DescendantsAndSelf("table").Skip(1).First().Descendants("table").First();
var tds   = table.Descendants("td");