【发布时间】:2022-01-24 00:36:57
【问题描述】:
在 XPath 中,我知道我可以使用 /following::* 选择所有后续元素,但是我想避免同时选择包含在任何后续元素中的子元素。
例如,给定这个文档:
<body>
<div id="div1">
<p id="p1">...</p>
<p id="p2">
<span id="span1"></span>
<span id="span2"><i id="i1">...</i></span>
</p>
<p id="p3">...</p>
</div>
<div id="div2">
<p id="p4">...</p>
<p id="p5">...</p>
</div>
</body>
如果我选择了span1,我想选择span2(但不是i1)、p3 和div2(但不是p4 或p5)。
在 Python 中,我的代码可能类似于:
>>> lxml.html.fromstring(document).xpath('//*[@id="span1"]/following::*')
[<Element span at 0x1082bd680>,
<Element i at 0x1082bd4f0>,
<Element p at 0x1082bd770>,
<Element div at 0x1082bd360>,
<Element p at 0x1082bd7c0>,
<Element p at 0x1082bdef0>]
但我想要返回的是:
[<Element span at 0x1082bd680>,
<Element p at 0x1082bd770>,
<Element div at 0x1082bd360>]
编辑:@kjhughes 的回答让我成功了 90%。因为现实生活中的示例可能没有我可以轻松使用的 ID 来匹配,所以我最终编写了如下代码:
find_following = lxml.html.etree.XPath(
"following::*[not(../preceding::*[. = node()])]"
)
【问题讨论】:
标签: python html xml xpath lxml