XPath:选择以下节点直到节点

4
在XPath中,我需要选择紧跟着

DATA

节点之后直到下一个

节点的

节点。例如以下结构:

<div class="box">
    <h2>NO</h2>
    <p>B:<span> Y</span></p>
    <h2>DATA</h2>
    <p>AA:<span> CONTENT</span></p>
    <p>AA:<span> MORE</span></p>
    <h2>NO</h2>
    <p>C:<span> Z</span></p>
    <h2>DATA</h2>
    <p>BB:<span> CONTENT</span></p>
    <p>BB:<span> MORE</span></p>
</div>

应该选择:

    <p>AA:<span> CONTENT</span></p>
    <p>AA:<span> MORE</span></p>
    <p>BB:<span> CONTENT</span></p>
    <p>BB:<span> MORE</span></p>

1个回答

10

这个怎么样?

p[preceding-sibling::h2[1][.="DATA"]]

我用Python编写了一个测试来检查我提供的XPath:

>>> from lxml import etree
>>> doc = etree.XML("""<div class="box">
...     <h2>NO</h2>
...     <p>B:<span> Y</span></p>
...     <h2>DATA</h2>
...     <p>AA:<span> CONTENT</span></p>
...     <p>AA:<span> MORE</span></p>
...     <h2>NO</h2>
...     <p>C:<span> Z</span></p>
...     <h2>DATA</h2>
...     <p>BB:<span> CONTENT</span></p>
...     <p>BB:<span> MORE</span></p>
... </div>""")
>>> doc.xpath('p[preceding-sibling::h2[1][.="DATA"]]')
[<Element p at 252ef70>, <Element p at 252efc8>, <Element p at 2542050>, <Element p at 25420a8>]
>>> doc.xpath('p[preceding-sibling::h2[1][.="DATA"]]/text()')
['AA:', 'AA:', 'BB:', 'BB:']

哦,我说得太快了。这只有在h2位置为[1]时才有效。如果结构中有多个<h2>DATA<h2>,它将无法选择以下节点。 - TMichel
1
这对于我来说仍然产生了所需的结果,针对您更新的示例。 - MattH
@TMichel 这个表达式(前缀为//)的意思是:找到所有的 p 元素,使得它们的第一个 h2 兄弟元素具有 DATA。这是一个正确的表达式,并且对于您的输入仍然可以给出正确的结果。 - Petr Janeček
没错。刚意识到原始数据格式不正确,所以你的解决方案绝对是正确的。再次感谢。 - TMichel

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