c# - 获取下一个同级节点中相同位置的节点

标签 c# xpath html-agility-pack

我正在使用 HTML 敏捷包来解析一些 HTML,其中一个片段的形式如下:

<tbody>
 <tr>
  <td><a href="remotelink1"><img /></a></td><td></td>
  <td><a href="site2"><img /></a></td><td></td>
  <td><a href="link3"><img /></a></td><td></td>
  <td><a href="site4"><img /></a></td><td></td>
  <td><a href="link5"><img /></a></td>
 </tr>
 <tr>
  <td style="text-align: left;" width="200" height="45">a<br>b<br>c</td><td width="17"></td>
  <td style="text-align: left;" width="200">d<br>e<br>f</td><td width="57"></td>
  <td style="text-align: left;" width="200">g<br>h<br>i</td><td width="57"></td>
  <td width="200">j<br>k<br>l</td><td width="57"></td>
  <td width="200">m<br>n<br>o</td>
 </tr>
 <tr>
  <td><a href="link6"><img /></a></td><td></td>
  <td><a href="site7"><img /></a></td><td></td>
  <td><a href="remotelink8"><img /></a></td><td></td>
  <td><a href="site9"><img /></a></td><td></td>
  <td><a href="link10"><img /></a></td>
 </tr>
 <tr>
  <td style="text-align: left;" width="200" height="45">p<br>q<br>r</td><td width="17"></td>
  <td style="text-align: left;" width="200">s<br>t<br>u</td><td width="57"></td>
  <td style="text-align: left;" width="200">v<br>w<br>x</td><td width="57"></td>
  <td width="200">y<br>z<br>aa</td><td width="57"></td>
  <td width="200">ab<br>ac<br>ad</td>
 </tr>

我面临的挑战是将每个单元格与其“下方”的行关联起来(即在父节点的下一个兄弟节点中的同一位置)。即我想将链接“remotelink1”与节点 a<br>b<br>c 相关联和“site2” d<br>e<br>f

我可以毫无问题地获取包含链接的单元格:

foreach (var item in doc.DocumentNode.SelectNodes("//div[@class='entry-content']/table/tbody/tr/td[a[@href]]"))

但是我正在努力将细胞放在下面,我能得到的最接近的是:

var detail = item.SelectSingleNode("../following-sibling::tr/td[position()]");

但这获取的是正在迭代的节点的位置,而不是 item其父节点中的节点。我可以使用 XPath 表达式将源节点的位置传递到谓词中,以查找下面的单元格吗?

最佳答案

我想出了这些丑陋的提议:

//tr[td[a[@href="remotelink1"]]]
 /following-sibling::tr[1]
     /td[ position() = count(//tr/td[a[@href="remotelink1"]]
                                 /preceding-sibling::td) + 1]

//tr[td[a[@href="site2"]]]
 /following-sibling::tr[1]
     /td[ position() = count(//tr/td[a[@href="site2"]]
                                 /preceding-sibling::td) + 1]
  • tr 定位为包含所需链接的 td
  • 选择其以下同级 tr 元素,
  • 限制为第一个下一个兄弟
  • 寻找子td元素
  • 并过滤那些位置等于具有所需链接的 td 的前同级 td 数量的内容,+1,因为 XPath 位置从 0 开始

我不知道 HTML agility pack 是否支持 XPath 变量,但您可以将变量更改为“remotelink1”,然后更改为“site2”,并在 2 [@href=...]< 中使用该变量

关于c# - 获取下一个同级节点中相同位置的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21503753/

相关文章:

xpath - 如何在 XQuery 中的 NCX 文件(用于 epub)中生成正确的播放顺序?

c# - 将嵌套 XML 反序列化到类中

java - 使用 xpath 读取多个 XML 属性

c# - 如何正确获取Json值?

用于选择属性值的 xpath 表达式

html - 在浏览器中显示 HTML 电子邮件正文之前确保安全

xml - XPath 按属性选择具有特定父节点的所有子节点

c# - 使用 HtmlAgilityPack 保留空白

c# - .NET 3.5 版和 .NET 3.5 版客户端配置文件有什么区别

c# - 使用 BouncyCaSTLe 的数字签名验证 - ECDSA with SHA 256, C#