用于查找最近的前一个兄弟的 XPath 语句
XPath statement to find nearest preceding sibling
我在 C# WPF 应用程序中使用 HTMLAgilityPack 循环访问本地 HTML 页面中的一些锚标记并提取 href 属性。这很好用,但我随后需要在 HTML 文档(这也是一个锚标签)中找到锚所在的标题。使用 XPath 应该很容易做到这一点,但我似乎无法获得适用于所有情况的声明。
这是我的 HTML 的示例(我无法控制):
<html>
<body>
<table>
<tr>
<td><div><a href="#maintitle" class="title">maintitle</a></div></td>
</tr>
<tr>
<td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
</tr>
<tr>
<td><div><a href="link1.pdf">link1</a></div></td>
</tr>
<tr>
<td><div><a href="link2.pdf">link2</a></div></td>
</tr>
<tr>
<td><div><a href="link3.pdf">link3</a></div></td>
</tr>
<tr>
<td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
</tr>
<tr>
<td><div><a href="link4.pdf">link4</a></div></td>
</tr>
<tr>
<td><div><a href="link5.pdf">link5</a></div></td>
</tr>
</table>
</body>
</html>
找到link1后,我再想找subtitle1。对于 link2 和 link3 也是如此。但是对于link4和link5,我想找到subtitle2。我正在使用这个 XPath 语句(第一部分只是为了模拟锚标记的选择,我一直在使用在线 XPath 评估器 https://www.freeformatter.com/xpath-tester.html):
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr//a[@class='subtitle']
这适用于 link1 到 link3,但对于 link4 和 link5,它 return 既有 subtitle1 也有 subtitle2。将 [1]
添加到 preceding-sibling::t
可修复 link4,但会破坏 link2、link3 和 link5:
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[1]//a[@class='subtitle']
我也试过将 last()
添加到 preceding-sibling::t
,但这导致找不到任何链接:
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[last()]//a[@class='subtitle']
我确信有一个简单的解决方案,但我决不能胜任 XPath,所以我很挣扎。如何将我的原始 XPath 语句获取到 return 最近的兄弟?
通过 link 文本获取字幕的定位器 ('link4')
(//a[text()='link5']/preceding::tr[.//a[@class='subtitle']])[last()]
逻辑:
//a[text()='link4']
- get element by linked text
//a[text()='link4']/preceding::tr
- search for all tr parents
[.//a[@class='subtitle']]
- get first parent containing tag a
with
class 'subtitle
'
(someLocator)[last()]
- get last element matching locator, in our case - get last parent containing tag a
with class 'subtitle
'
另一个选项 - 最初搜索 tr
而不是 a
元素
(//tr[.//a[text()='link5']]/preceding-sibling::tr//a[contains(@class,'subtitle')])[last()]
希望它能帮助任何人获得构建定位器的逻辑对象
尝试使用 xpath :
//a[@href='<your_input>']/preceding-sibling::tr[.//a[@class='subtitle']][1]
其中 <your_input>
可以是 link1.pdf
到 link5.pdf
我在 C# WPF 应用程序中使用 HTMLAgilityPack 循环访问本地 HTML 页面中的一些锚标记并提取 href 属性。这很好用,但我随后需要在 HTML 文档(这也是一个锚标签)中找到锚所在的标题。使用 XPath 应该很容易做到这一点,但我似乎无法获得适用于所有情况的声明。
这是我的 HTML 的示例(我无法控制):
<html>
<body>
<table>
<tr>
<td><div><a href="#maintitle" class="title">maintitle</a></div></td>
</tr>
<tr>
<td><div><a href="#subtitle1" class="subtitle">subtitle1</a></div></td>
</tr>
<tr>
<td><div><a href="link1.pdf">link1</a></div></td>
</tr>
<tr>
<td><div><a href="link2.pdf">link2</a></div></td>
</tr>
<tr>
<td><div><a href="link3.pdf">link3</a></div></td>
</tr>
<tr>
<td><div><a href="#subtitle2" class="subtitle">subtitle2</a></div></td>
</tr>
<tr>
<td><div><a href="link4.pdf">link4</a></div></td>
</tr>
<tr>
<td><div><a href="link5.pdf">link5</a></div></td>
</tr>
</table>
</body>
</html>
找到link1后,我再想找subtitle1。对于 link2 和 link3 也是如此。但是对于link4和link5,我想找到subtitle2。我正在使用这个 XPath 语句(第一部分只是为了模拟锚标记的选择,我一直在使用在线 XPath 评估器 https://www.freeformatter.com/xpath-tester.html):
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr//a[@class='subtitle']
这适用于 link1 到 link3,但对于 link4 和 link5,它 return 既有 subtitle1 也有 subtitle2。将 [1]
添加到 preceding-sibling::t
可修复 link4,但会破坏 link2、link3 和 link5:
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[1]//a[@class='subtitle']
我也试过将 last()
添加到 preceding-sibling::t
,但这导致找不到任何链接:
//a[@href='link4.pdf']/ancestor::tr/preceding-sibling::tr[last()]//a[@class='subtitle']
我确信有一个简单的解决方案,但我决不能胜任 XPath,所以我很挣扎。如何将我的原始 XPath 语句获取到 return 最近的兄弟?
通过 link 文本获取字幕的定位器 ('link4')
(//a[text()='link5']/preceding::tr[.//a[@class='subtitle']])[last()]
逻辑:
//a[text()='link4']
- get element by linked text
//a[text()='link4']/preceding::tr
- search for all tr parents
[.//a[@class='subtitle']]
- get first parent containing taga
with class 'subtitle
'
(someLocator)[last()]
- get last element matching locator, in our case - get last parent containing taga
with class 'subtitle
'
另一个选项 - 最初搜索 tr
而不是 a
元素
(//tr[.//a[text()='link5']]/preceding-sibling::tr//a[contains(@class,'subtitle')])[last()]
希望它能帮助任何人获得构建定位器的逻辑对象
尝试使用 xpath :
//a[@href='<your_input>']/preceding-sibling::tr[.//a[@class='subtitle']][1]
其中 <your_input>
可以是 link1.pdf
到 link5.pdf