<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>
我在一个网页中有上述内容,我希望能够瞄准第一个
h2
之后包含文本'Headline 1'
的所有元素,直到但不包括包含文本h2
的元素'Headline 2'
。我可以瞄准这样的元素:
//*[count(preceding-sibling::hr)=1]
但这并不特定于包含的文本,因此如果页面发生了更改,那么xpath可能指向完全不同的内容。
在sudo代码中,我想要的是:
把标题
'Headline 1'
和标题
'Headline 2'
包括'Headline 1'
这有可能吗?
最佳答案
这个xpath,
//*[ preceding-sibling::h2[. = 'Headline 1']
and following-sibling::h2[. = 'Headline 2']]
将选择字符串值为
h2
和'Headline 1'
的'Headline 2'
s之间的所有元素:<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
。安德森最初的想法是可行的:
//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'
。关于html - XPath选择两个标题之间的所有元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43122455/