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

时间:2016-05-15 18:15:56

标签: python html xml xpath scrapy

<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()

似乎无法奏效。我的内容总是空着。

2 个答案:

答案 0 :(得分:2)

对于此HTML,

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

要使用p选择divid="something"元素之前的所有同级元素,请使用此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

答案 1 :(得分:0)

//p[last()]/preceding-sibling::*
  • 使用last()指向最后一个<p>
  • 然后使用*选择<p>的所有先前的同级