【问题标题】:traversing xpath further from selected node从所选节点进一步遍历 xpath
【发布时间】:2014-09-12 08:40:53
【问题描述】:

我有以下html结构

<div class="ac_x">
    <h3>
        <a href="">Title</a>                
    </h3>
    <a class="">
        <img title="" />
    </a>
    <dl>
        <dt class="">Person</dt>
        <dd class="">
        <dt class="ac_i_ard">Address</dt>
        <dd class="ac_i_ard">
            <a href="">Target text</a>
        </dd>
    </dl>
</div>

我正在使用

选择标题
 var nodes = htmlDoc.DocumentNode.SelectNodes(@"//div[@class='ac_x']/h3/a")
                         .Cast<HtmlAgilityPack.HtmlNode>().
                         .Select ....

现在我想以编程方式选择&lt;dd class="ac_i_ard"&gt; 下的下一个目标文本

我试过了

node[0].SelectSingleNode(@"../dl/dd[2]/a");  

但显然我没有选择节点

Object reference not set to an instance of an object.

如何以编程方式从已选择的节点中选择节点(目标文本)?

【问题讨论】:

    标签: c# .net xpath html-agility-pack


    【解决方案1】:

    另一个问题是第一个&lt;dd&gt;标签没有关闭。因此,以下所有同级都被 HtmlAgilityPack 解释为子级。这就是为什么以下工作:

    var n = node.SelectSingleNode(@"../following-sibling::dl/dd/dd[@class='ac_i_ard']/a");
    

    或者更简单的方法:

    var n = node.SelectSingleNode(@"../following-sibling::dl//dd[@class='ac_i_ard']/a");
    

    [.NET Fiddle demo]

    【讨论】:

      【解决方案2】:

      你可以使用

      ../../dl/dd[@class='ac_i_ard']/a
      

      ../following-sibling::dl/dd[@class='ac_i_ard']/a
      

      【讨论】:

      • 请你在 .net fiddle dotnetfiddle.net/VzucVw 上看到这个例子我想我很接近但显然我错过了一些东西
      • 你的字符串html无效,因为缺少结束标签&lt;/dd&gt;,把"&lt;dl&gt;&lt;dt class=\"\"&gt;Person&lt;/dt&gt;&lt;dd class=\"\"&gt;&lt;dt class=\"ac_i_ard\"&gt;Address改成"&lt;dl&gt;&lt;dt class=\"\"&gt;Person&lt;/dt&gt;&lt;dd class=\"\"&gt;&lt;/dd&gt;&lt;dt class=\"ac_i_ard\"&gt;Address
      【解决方案3】:
      var rootNodes = htmlDoc.DocumentNode.SelectNodes(@"//div[@class='ac_x']")
      foreach(var n in rootNodes)
      {
           var titleNode = n.SelectSingleNode(@"h3/a");
           var ddNodes = n.SelectNodes(@"dl/dd[@class='ac_i_ard']]/a");
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-21
        • 2019-01-23
        • 1970-01-01
        • 1970-01-01
        • 2022-09-29
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        相关资源
        最近更新 更多