如何在 XPath 中按子元素的属性选择前面的同级元素



我正在尝试使用XPath查询在维基百科页面上选择几个元素。

我想要的是类"mw-parser-output"<div>的所有子级,它们位于页面的"引用"部分之前,该部分从<h2>元素开始,该元素是ID为"References"的<span>元素的父级

换句话说,

.
.
.
<!-- EVERYTHING FROM HERE -->
<div class="mw-parser-output">
<p class="mw-empty-elt">
</p>
.
.
.
<ul>
.
<li>
.
<a href="/wiki/List_of_Yale_University_people" title="List of Yale University people">List of Yale University people</a>
</li>
</ul>
<!-- TO HERE, WHERE THE REFERENCES START -->
<h2>
<span class="mw-headline" id="References">References</span>
</h2>
.
.
</div>
.
.

我已经弄清楚了如何用//span[@id='References']/ancestor::h2选择我不想要的第一个元素,以及我不想要//h2/span[@id='References']的范围,以及如何选择"mw-parser-output"的所有子元素不是那个特定的元素//div[@class = 'mw-parser-output']/*[not(span[@id='References']/ancestor::h2)]

但是,使用这些查询来创建我想要的查询一直是一个挑战。例如,此 XPath 查询不会在 Google Chrome//div[@class = 'mw-parser-output’]/*[following-sibling::h2/span[@id [.eq ’References’]]]中产生结果。

我正在使用Google Chrome来测试这些查询,但我的最终目标是在R中使用xpathSApply提取元素。

如果有人/无法重现这些问题或看到我出错的地方,我将非常感谢一些指导。

看起来我想使用following-sibling轴而不是preceding-sibling.下面的 XPath 与其他答案的区别仅在于使用following-sibling,给出了所需的结果。

//div[@class='mw-parser-output']/*[count(following-sibling::h2//span[.='References'])>0]

结果是类mw-parser-outputdiv的所有子级,这些子级位于 idReferencesspan元素的父级h2之前

最新更新