C# 使用Html Agility Pack获取特定表
我在使用HTML Agility Pack获取某些特定表时遇到问题。我也不能更改实际的HTML,所以我不能使用其他ID、类或任何东西 有人能告诉我如何访问下面的每个表吗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
<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");