我正在使用 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/