HtmlAgilityPack - 如何读取特定表格 - c# 4.0

5
使用C# 4.0和HtmlAgilityPack,如何读取特定表格内的值?我的意思是说,假设有10个表格,我想从第6个表格中读取值,或者我有表格ID。
或者说我想读取某个td后面的td值。
或者在特定的div、元素或文本之后出现的表格。这些可行吗?

2
你在说什么?展示标记。解释你需要获取什么。 - Darin Dimitrov
1
你尝试过什么?一个不错的起点在这里:http://www.4guysfromrolla.com/articles/011211-1.aspx。我建议你先阅读一下这篇文章,尝试你提到的方法,如果还是无法解决问题,再回来提供更具体的情况。 - Doozer Blake
1
谢谢提供链接。例如,页面中可能有许多表格。假设我想在某个关键字或div元素后获取表格。我该怎么做?可以通过读取标记后的元素来实现。 - Furkan Gözükara
2
删除了库文档中(不必要的)注释。 - user47589
停止纯文字描述,将一些 HTML 示例粘贴到你的问题中。只有提供输入和期望输出的示例,我们才能提供帮助。如果没有这些,就无法进行有效的解答。 - Asbjørn Ulsberg
1个回答

16

你所提到的所有问题都可以相对容易地解决。虽然它的文档可能缺乏,但在使用和功能上应该类似于XML和网络中的XmlDocument实现。

如何读取特定表格内的值?比如说有10个表格,我想读取第6个表格的值或者我已经知道表格的ID。

找到第6个表格:

// XPath
var table6 = doc.DocumentNode.SelectSingleNode("//table[6]");

// LINQ
var table6 = doc.DocumentNode.Descendants("table").Skip(5).FirstOrDefault();

通过id查找表格/元素:

var myTable = doc.GetElementById("myTable");

// XPath
var myTable = doc.DocumentNode.SelectSingleNode("//table[@id='myTable']");
var myTable = doc.DocumentNode.SelectSingleNode("//*[@id='myTable']");

// LINQ
var myTable = doc.DocumentNode
    .Descendants("table")
    .Where(table => table.Attributes.Contains("id"))
    .SingleOrDefault(table => table.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .Where(e => e.Attributes.Contains("id"))
    .SingleOrDefault(e => e.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants("table")
    .SingleOrDefault(table => table.GetAttributeValue("id", null) == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .SingleOrDefault(e => e.GetAttributeValue("id", null) == "myTable");

假设我想要读取某个特定 td 后面的 td 值。

// XPath
var certainTd = table6.SelectSingleNode("//td[2]");
var tdAfterCertainTd = certainTd.SelectSingleNode("following-sibling::td[1]");

// LINQ (not so easy)
var certainTd = table6.Descendants("td").Skip(1).FirstOrDefault();
var tdAfterCertainTd = certainTd.NextSibling;
while (tdAfterCertainTd != null)
{
    if (tdAfterCertainTd.Name == "td")
        break;
    tdAfterCertainTd = tdAfterCertainTd.NextSibling;
}

如何在某个 div 元素或文本后面插入表格?

// XPath
var certainDiv = doc.DocumentNode.SelectSingleNode("//div[1]");
var tableAfterCertainDiv = certainDiv.SelectSingleNode("following-sibling::table[1]");

// LINQ (not so easy)
var certainDiv = doc.DocumentNode.Descendants("div").FirstOrDefault();
var tableAfterCertainDiv = certainDiv.NextSibling;
while (tableAfterCertainDiv != null)
{
    if (tableAfterCertainDiv.Name == "table")
        break;
    tableAfterCertainDiv = tableAfterCertainDiv.NextSibling;
}

你应该注意到一些模式。


1
谢谢你的优秀回答。有没有地方可以学习XPath呢?有没有好的教程、电子书或视频呢?谢谢。 - Furkan Gözükara
1
我不知道有哪些教程网站。我只能建议找一个列出运算符、函数和语法的网站,然后尝试编写一些处理数据的程序。并且要多多练习。 - Jeff Mercado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接