繁体   English   中英

Html Agility Pack无法选择节点

[英]Trouble selecting nodes with Html Agility Pack

我有当前的HTML布局

<table> //table[1]
</table>
<table> //table[2]
<tbody>
   <tr>
      <td>
         <p>
            &nbsp;
         </p>
      </td>
   </tr>
   <tr>
      <td>
         <table> //table[1]//table[1]
            <tbody>
               <tr>
                  <td>
                     <p>
                        INFO 1
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 2
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 3
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 4
                     </p>
                  </td>
               </tr>
            </tbody>
         </table>
      </td>
   </tr>
   <tr>
      <td>
         <table> //table[1]//table[2]
            <tbody>
               <tr>
                  <td>
                     <p><strong>Name</strong></p>
                  </td>
                  <td>
                     <p><strong>Quantity</strong></p>
                  </td>
               </tr>
               <tr>
                  <td>
                     <p>Apples </p>
                  </td>
                  <td>10</td>
               </tr>
            </tbody>
         </table>
      </td>
   </tr>
   <tr>
      <td>
         <table>  //table[1]//table[3]
         </table>
      </td>
   </tr>
</tbody>
</table>

我正在尝试获取//table[1]//table[2] ,但对于以下内容,我一直保持空HtmlNode( System.NullReferenceException ):

不起作用: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[2]//tbody//tr");

我不确定为什么会这样,因为当我尝试获取//table[1]//table[1] ,使用这种语法就可以正常工作

作品: doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[1]//tbody//tr");

我是否误解了索引如何与HTML Agility Pack一起使用?

//table[2] 在同一个父对象中返回第二个<table>元素,因为在XPath中:

[] )的优先级(优先级)比( /// )高。 [ 供参考 ]

在您的情况下,每个<td>只有一个<table> <td> ,因此Xpath表达式什么也不返回。 一种可能的解决方案是将方括号括起来以更改优先级:

(//table[2]//tbody//tr//td//table)[2]//tbody//tr

在Xpath上方,从内部XPath //table[2]//tbody//tr//td//table返回的所有<table>获得第二个<table>元素。 然后从该<table>继续返回后代//tbody//tr元素。

我最终不得不根据tr的不tr来确定为什么我的另一种方法行不通,但是这种方法行得通。

我基本上将索引移到了表格之上的下一层。 因此,在第一个tbody中,此后的每个表都在tr / td语句中,并且我只是构造了HtmlNode来索引tr的索引。 如果您扩大选择流程,也许敏捷包会更好用? IDK。

无论如何...

对于table[2]//table[1]我使用了:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table");
foreach (var cell in table.SelectNodes(".//tr//td/p"))
...

如果您注意到上面的示例HTML,我选择了tr [2],因为我之前有一个tr / td,中间有一个空格

对于table[2]//table[2]

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[3]//table[1]");
foreach (var cell in table.SelectNodes(".//tr//td"))
...

对于遇到问题的任何人,请尝试通过将特定标签推入更广泛的标签来将搜索范围扩大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM