XPath如何选择两个标题之间的所有元素?

4
<h2>Headline 1</h2>
<p>some text</p>
<p>some more text</p>
<ul>
<li>list item 1</li>
<li>list item 2</li>
</ul>
<p>more text</p>
<h2>Headline 2</h2>

我在网页中有以上内容,我想要定位所有第一个包含文本“Headline 1”的h2元素之后的所有元素,直到但不包括包含文本“Headline 2”的h2元素。
我可以这样定位这些元素:
//*[count(preceding-sibling::hr)=1]

但这不是特定于所包含的文本,因此如果页面发生变化,那么xpath可能会指向完全不同的内容。

以sudo代码的方式,我想要的是:

给我所有在标题 'Headline 1' 和标题 'Headline 2' 之间的元素,包括 'Headline 1'

这个有可能吗?

3个回答

3

这个 XPath,

//*[    preceding-sibling::h2[. = 'Headline 1'] 
    and following-sibling::h2[. = 'Headline 2']]

将选择所有字符串值为'Headline 1''Headline 2'h2元素之间的所有元素:

<p>some text</p>
<p>some more text</p>
<ul>
<li>list item 1</li>
<li>list item 2</li>
</ul>
<p>more text</p>

Andersson在评论中指出,OP想要选择第一个h2标签。
Andersson最初的想法是可行的:
//h2[. = 'Headline 1'] |
//*[    preceding-sibling::h2[. = 'Headline 1'] 
    and following-sibling::h2[. = 'Headline 2']]

这里还有另一种方式:

//*[self::h2[. = 'Headline 1']
    or (    preceding-sibling::h2[. = 'Headline 1'] 
        and following-sibling::h2[. = 'Headline 2']]

或许最理想的方式是:
//h2[. = 'Headline 2']
    /preceding-sibling::*[not(following-sibling::h2[. = 'Heading 1'])]

这是因为它避免了两次指定'Heading 1'的必要。


0

如果尝试像这样的东西会怎么样呢?

//*[text()="Headline 1"]/following-sibling::*

0
//h2[contains(.,'Headline 1')]//*

将返回标题下的每个元素。您可以使用

进一步缩小范围。
//h2[contains(.,'Headline 1')]//p

对于段落文本,但这不包括li元素。


在重新查看我用于测试的HTML代码后,我现在意识到它是在<span>中。你显然是正确的,谢谢你指出来。 - Bill Hileman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接