使用C# HtmlAgilityPack选择特定h2下的表格

7

我有一些html代码:

<h2>Results</h2>
 <div class="box">
 <table class="tFormat">
      <th>Head</th>
      <tr>1</tr>
 </table>
</div>

<h2>Grades</h2>
 <div class="box">
 <table class="tFormat">
      <th>Head</th>
      <tr>1</tr>
 </table>
</div>

我想知道如何获取“结果”下面的表格。
我已经尝试过:
        var nodes = doc.DocumentNode.SelectNodes("//h2");

        foreach (var o in nodes)
        {
            if (o.InnerText.Equals("Results"))
            {
                foreach (var c in o.SelectNodes("//table"))
                {
                    Console.WriteLine(c.InnerText);             
                }
            }
        }

它可以工作,但也会获取成绩 h2 下面的表格

2个回答

5
请注意,div不在header的层次结构内,因此在那里寻找它是没有意义的。
这可以为您工作-它可以找到标题后面的下一个元素:
if (o.InnerText.Equals("Results"))
{
    var nextDiv = o.NextSibling;
    while (nextDiv != null && nextDiv.NodeType != HtmlNodeType.Element)
        nextDiv = nextDiv.NextSibling;
    // nextDiv should be correct here.
}

您还可以编写更具体的xpath来查找特定的div元素:
doc.DocumentNode.SelectNodes("//h2[text()='Results']/following-sibling::div[1]");

关于“o.SelectNodes”:我希望它按dom层次结构工作,但实际上它在根文档中再次搜索 - 这就是你得到2个<div>的原因。 我之前看过这个问题:https://dev59.com/s3E85IYBdhLWcg3wOw_s#Nuz_oIgBc1ULPQZFscc9 - Kobi
哦,如果有人想运行代码,只需要添加几行:HtmlWeb web = new HtmlWeb(); var doc = web.Load("http://jsbin.com/exegog/2"); - Kobi

0
 var nodes = doc.DocumentNode.SelectNodes("//h2");

        if (nodes.FirstOrDefault()!=null)
        {
            var o=nodes.FirstOrDefault();
            if (o.InnerText.Equals("Results"))
            {
                foreach (var c in o.SelectNodes("//table"))
                {
                    Console.WriteLine(c.InnerText);             
                }
            }
        }

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