在 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()])]"
)
uj5u.com熱心網友回復:
這個 XPath,
//*[@id="span1"]/following::*[not(../preceding::*[@id="span1"])]
選擇目標元素后面的span元素,其父元素沒有目標span元素作為前驅,
<span id="span2"><i id="i1">...</i></span>
<p id="p3">...</p>
<div id="div2"> <p id="p4">...</p> <p id="p5">...</p> </div>
按照要求。
uj5u.com熱心網友回復:
XPath 3.1 具有以下功能outermost():outermost(following::*)選擇所有后續元素,不包括節點集中另一個元素的后代。
XPath 2.0 允許following::* except following::*/descendant::*.
在 XPath 1.0 中,您可以表示($A except $B)為$A[count(.|$B)=count($B)]. (雖然這并不是那么有用,因為 XPath 本身無法系結變數)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391144.html
下一篇:替換XSL中的HTML標簽
