<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/

10-09 01:09