使用scrapy,如何获得xpath解析结果的一部分?

时间:2017-01-30 11:06:36

标签: python scrapy

这是我蜘蛛的一部分:

def parse(self, response):

        titles = HtmlXPathSelector(response).select('//li')
        for title in titles:
            item = EksidefeItem()
            item['favori'] = title.select("//*[@id='entry-list']/li/@data-favorite-count").extract()
            item['entry'] = ['<a href=https://eksisozluk.com%s'%a for a in title.select("//*[@class='entry-date permalink']/@href").extract()]
            item['yazari'] = title.select("//*[@id='entry-list']/li/@data-author").extract()
            item['basligi'] = title.select("//*[@id='topic']/h1/@data-title").extract()
            item['tarih'] = title.select("//*[@id='entry-list']/li/footer/div[2]/a[1]/text()").extract()

            return item

我从item['tarih']获取日期和时间,但是它的确切日期和时间内还有其他值。以下是从中解析数据的示例:

  

26.01.2017 20:04~20:07

我想只使用日期部分(左起10个字符)作为

  

2017年1月26日

我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

考虑使用item loaders。您可以扩展ItemLoader类并编写自己的自定义项加载器。

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose

def tarih_modifier(value):
    return value[:10]

class MyCustomLoader(ItemLoader):
    default_output_processor = TakeFirst()
    tarih_in = MapCompose(tarih_modifier)

您也可以在单独的模块中编写此类。现在在parse方法中,您可以使用此加载器类。

def parse(self, response):
    l = MyCustomLoader(item=EksidefeItem(), response=response)
    l.add_xpath('name', "//*[@id='entry-list']/li/footer/div[2]/a[1]/text()")
    # add the rest 
    return l.load_item()

使用loader类将比定制值更方便。

答案 1 :(得分:0)

您可以使用字符串切片来获取日期:

item['tarih'] = title.select("//*[@id='entry-list']/li/footer/div[2]/a[1]/text()").extract()
item['tarih'][0] = item['tarih'][0][:10]

但我还会添加一些验证(请查看datetime.datetime.strptime())以确保您有一个有效的日期。