所以现在如果我有这样的事情:
//div[@class='artist']/p[x]/text()
x可以是3或4,也可以是不同的数字。幸运的是,如果我要找的不是3,我可以检查null并继续直到找到文本。问题是我宁愿知道每次都要去正确的元素。所以我尝试了这个:
div[@class='people']/h3[text()='h3 text']/p/text()
因为<p>
之后总会有<h3>h3 text</h3>
。但是,这永远不会返回任何内容,通常会导致错误。如果我删除/ p,我将返回'h3 text'。
无论如何,如何在<p>
之后直接获得<h3>
?
BTW,我在Java中使用HTMLCleaner。
答案 0 :(得分:10)
默认情况下,如果未指定axis,则会获得child::
轴,这就是/
运算符似乎按子节点下降DOM树的原因。每个斜线后都有一个隐含的child::
。
在您的情况下,您不希望找到<div>
的孩子,您希望找到它的兄弟。兄弟姐妹是同一嵌套级别的元素。具体来说,您应该使用following-sibling::
轴。
div[@class='people']/h3[text()='h3 text']/following-sibling::p/text()
Axes是XPath的高级功能。它们是使XPath特别强大的功能之一。
您已经熟悉了另一个轴,但您可能没有意识到:@
符号是attribute::
的简写。当您写@href
时,您实际上是在说attribute::href
,就像查找名为“href”的属性而不是子一样。
斧头,嗯?简写,是吗?告诉我更多,你说? OK!
.
和..
分别是更详细的self::node()
和parent::node()
的简写。如果你愿意,你可以使用较长的表格。
您通常看作//
或//p
的{{1}}运算符在斜杠之间隐藏body//a
。 descendant-or-self::node()
是//p
。
答案 1 :(得分:1)
无论如何,我如何得到
<p>
直接在<h3>
之后?
使用强>:
div[@class='people']/h3[text()='h3 text']/following-sibling::p[1]