某些<p>之后的Scrapy提取

时间:2016-05-17 05:18:20

标签: python scrapy scrapy-spider

说我有这样的结构;

<div id="body">
<h1> Title </h1>
<p> Date Created </p>
<p class="text-bold"> Description </p>
<p> Para1 </p>
<p> Para2 </p>
<p> Para..</p>
<p> ParaN </p>

我试图将Para1加到ParaN上。要添加到其上,某些链接中的Para1可能会被设置为//p[5],有时会被设置为//p[6]

因此,运行默认值

def parse_details(self, response):
        item = response.meta["item"]
        item['Message'] = response.xpath('//p[x]/text()').extract()

        yield item

它有时会失败并返回错误的字段,因为x有点动态。保持不变的是我需要<p class="text-bold"> Description </p>下的所有字段。

无论如何都要这样做?

1 个答案:

答案 0 :(得分:2)

如果您需要<p class="text-bold"> Description </p>之后的所有字段,只需尝试xpath following-sibling函数

html = """
<div id="body">
<h1> Title </h1>
<p> Date Created </p>
<p class="text-bold"> Description </p>
<p> Para1 </p>
<p> Para2 </p>
<p> Para..</p>
<p> ParaN </p>
"""

from scrapy import Selector
sel = Selector(text=html)
xpath = "//p[contains(text(), 'Description')]/following-sibling::p/text()"
r = sel.xpath(xpath).extract()
print(r)
# [u' Para1 ', u' Para2 ', u' Para..', u' ParaN ']