如何通过 XPath 选择最后一个 p 元素之前的所有元素?

Posted

技术标签:

【中文标题】如何通过 XPath 选择最后一个 p 元素之前的所有元素?【英文标题】:How to select all the elements before last p element via XPath? 【发布时间】:2016-09-11 12:54:30 【问题描述】:
<div id="something">
    <a id="dd_start">
    <p>A</p
    <h2>B</h2>
    <p>C</p>
    <h5>D</h5>
    <script> </script>
    <p>E</p>
    <div></div>
</div>

如何获取最后一个p之前的所有元素?我想要ph2ph5:A B C D。

我试过了:

item['contents'] = ' '.join(response.xpath('//*[@id="something"]/preceding-sibling::*p//text()').extract()).strip()

item['contents'] = ' '.join(response.xpath('//*[@id="something"]/preceding-sibling::p[last()]//text()').extract()).strip()

item['contents'] = ' '.join(response.xpath('//*[@id="something"]/p[last()]/preceding-sibling::*//text()').extract()).strip()

似乎无法正常工作。我的内容总是返回空。

【问题讨论】:

您是否打算将您添加的文本设置为 withinbetween @ 987654330@、h2等元素?您现在正在之间显示它。 嗯,我想要最后一个

之前的所有文本 .. 我客户的网站有时会与 h2 或 h3 之类的其他内容混合在一起 .. 我实际上想把内容刮掉 ..

我可以go on and on with updates,猜猜你想要什么,或者你可以为自己和你的读者节省大量时间并创建一个minimal reproducible example 你真的应该已经完成了。 【参考方案1】:

对于这个 html

<div id="something">
    <p/>
    <h2/>
    <p/>
    <h5/>
    <script/>
    <p/>
    <div/>
</div>

要使用id="something" 选择div 下最后一个p 元素之前的所有同级元素,请使用此XPath:

//div[@id="something"]/p[last()]/preceding-sibling::*

返回

<p/>
<h2/>
<p/>
<h5/>
<script/>

根据要求。


更新 1:对于这个更新的 HTML,

<div id="something">
    <p/>A
    <h2/>B
    <p/>C
    <h5/>D
    <script/>
    <p/>E
    <div/>
</div>

这个 XPath

//div[@id="something"]/p[last()]/preceding-sibling::text()

现在将选择

A
B
C
D

根据您最新更新中的要求。


更新 2:如果您的 HTML 更像这样,

<div id="something">
    <p>A</p>
    <h2>B</h2>
    <p>C</p>
    <h5>D</h5>
    <script/>
    <p>E</p>
    <div/>
</div>

这个 XPath

//div[@id="something"]/p[last()]/preceding-sibling::*/text()

现在将选择前面同级元素中的文本节点:

A
B
C
D

【讨论】:

不需要添加/text()?但我试过没有 text() 只是现在仍然不能:( 您说您想要ph2ph5,而您的示例没有显示任何文本。是的,您可以获取文本,但您必须更具体:编辑您的问题,将文本添加到您的示例中,并说明哪些文本应该返回,哪些文本不应该返回。 yaya 但它仍然返回空:( 您的 HTML 示例格式不正确,它必须是这样才能使用 XPath。我已经为你关闭了标签,所以它的格式很好。给定格式良好的 XML,我展示的 XPath 会返回请求的元素。【参考方案2】:
//p[last()]/preceding-sibling::*
使用last() 指向最后一个&lt;p&gt;。 然后使用* 选择&lt;p&gt; 的所有前面的兄弟姐妹

【讨论】:

以上是关于如何通过 XPath 选择最后一个 p 元素之前的所有元素?的主要内容,如果未能解决你的问题,请参考以下文章

XPath 选取未知节点 & 选取若干路径

Xpath:选择除具有特定属性的元素之外的所有元素

xpath语法

xpath语法

如何使用 XPath 选择任意深度的子元素?

selenium-xpath选择操作web元素