如何定位被br标签分隔的双词文本的XPath?面试求助
正确定位被
<br>分隔的两个单词的XPath写法 嘿,我来帮你搞定这个XPath的问题!首先得明确我们要处理的HTML结构大概是什么样的——比如类似这样:
<p>Apple<br>Banana</p> <div>Orange<br>Mango</div>
你之前用contains()+AND或者following::轴没成功,大概率是因为这些写法没有精准匹配到“两个单词被<br>直接分隔”这个核心条件,要么范围太宽,要么没约束节点关系。
下面给你几种精准的写法,根据你的需求选择:
1. 定位包含目标文本对的父元素
如果你的目标是找到同时包含Word1和Word2,且两者被<br>分隔的父元素,可以用这种写法:
//*[text()[1]='Word1' and text()[2]='Word2' and child::br[position()=1]]
解释:
text()[1]='Word1':指定父元素下的第一个文本节点是Word1text()[2]='Word2':第二个文本节点是Word2child::br[position()=1]:父元素下的第一个子元素是<br>,确保两个文本被它分隔
比如针对上面的HTML例子,要找包含Apple<br>Banana的<p>,就用:
//p[text()[1]='Apple' and text()[2]='Banana' and child::br[position()=1]]
2. 直接定位第二个单词的文本节点
如果你需要直接定位到Word2这个文本节点(前提是它前面紧邻<br>,而<br>前面是Word1),可以用兄弟轴精准匹配:
//text()[.='Word1']/following-sibling::br[1]/following-sibling::text()[1][.='Word2']
解释:
//text()[.='Word1']:先找到内容为Word1的文本节点/following-sibling::br[1]:取它的第一个后续兄弟节点,必须是<br>/following-sibling::text()[1][.='Word2']:再取<br>的第一个后续兄弟文本节点,内容必须是Word2
为什么你之前的方法不对?
contains()+AND:比如//*[contains(text(),'Word1') and contains(text(),'Word2')]会匹配到像<p>Word1 some text Word2</p>这种没有<br>的元素,完全没约束分隔条件,所以会出错。following::轴:如果只是写//text()[.='Word1']/following::text()[.='Word2'],会匹配所有Word1后面的Word2,不管中间隔了多少元素,根本没限定中间是<br>,自然不符合要求。
内容的提问来源于stack exchange,提问作者Pratiksha Jadhav
相关产品推荐
相关产品推荐

