我最近遇到了一个问题。
我需要在页面上找到一个包含特定文本的div标签。问题是,内部链接标记将文本分为两部分,因此HTML树将如下所示:
**<html>
<...>
<div>
start of div text - part 1
<a/>
end of div text - part 2
</div>
<...>
</html>**
要唯一地标识div标签,我需要将div文本分为两部分。自然,我会想到这样的XPath:
.//div[contains(text(), 'start of div text') and contains(text(), 'end of div text')]
但是,它不起作用,找不到第二部分。
唯一描述这种标签的最佳方法是什么?
答案 0 :(得分:2)
尝试在XPath下面使用两个文本节点来匹配所需的div
:
//div[normalize-space(text())="start of div text - part 1" and normalize-space(text()[2])="end of div text - part 2"]
答案 1 :(得分:1)
您快到了。您只需要用 .
替换//div[contains(., 'start of div text') and contains(., 'end of div text')]
,如下所示:
{{1}}
这是验证的快照:
答案 2 :(得分:0)
这应该有效:
//div[contains(text(), 'start of div text') and contains(./a/text(), 'end of div text')]
答案 3 :(得分:0)
如果您有这样的HTML DOM树:
<div id="container" class="someclass">
<div>
start of div text - part 1
<a/>
end of div text - part 2
</div>
</div>
要提取div文本,您可以这样编写xpath:
//div[@id='container']/child::div
P.S:基于文本编写xpath以查找相同的确切文本不是编写Xpath的好方法。
答案 4 :(得分:0)
如果您只需要这些子文本元素的div
元素,则可以从“第1部分”中分离出一段独特的内容,然后尝试以下操作:
//*[contains(., 'part 1')]/parent::div
这样,您无需考虑div
的属性。
但是,这通常是不是最佳实践。理想情况下,大多数情况下应使用以下Xpath:
//div[@id,('some id') and contains(., 'part 1')]