如何使用xpath在特定类中的特定位置排除标签?

时间:2019-08-22 07:42:09

标签: xpath scrapy

我有这个示例标签:

<div class='aaa'>
    <p>aaa</p>
    <div>bbb</div>
    <div>ccc</div>
    <div class='ddd'>
        <div>ddd</div>
        <div>eee</div>
    </div>
</div>

在这里,我想提取<div class='aaa'>下的所有内容,并排除<div>eee</div>

在运行时,<div class='ddd'>下的标签数量可能会有所不同,但深度相同,但<div>eee</div>总是倒数第二。

所以我尝试使用not(),last(),如下所示,但到目前为止,它们都没有起作用。

//div[contains(@class,"aaa")]//(text())[not(@class="ddd" and position()=last())]

如何修补xpath命令使其正常工作?

谢谢。

2 个答案:

答案 0 :(得分:0)

最初获取所有元素,例如//div[contains(@class,"aaa")]。然后从列表中弹出最后一个元素,并使用text()获取所有其他文本内容。

答案 1 :(得分:0)

这是应该返回aaa bbb ccc ddd的解决方案。

string-join((//div[contains(@class,"aaa")]//*[not(@class)])[position()<last()]/text(),' ')

截屏: enter image description here

如果您不想在text()之间留空格,请相应地更改string-join last参数。

选项2:

string-join((//div[contains(@class,"aaa")]//text()[not(normalize-space(.)='')])[position()<last()],' ')