Scrapy:如何使用ItemLoader填充空项?

时间:2016-03-28 21:37:26

标签: python json python-3.x scrapy screen-scraping

我是Scrapy的新手,需要一些帮助,因为我查看不同的主题并且我很难找到特别针对我的案例的解决方案,或者我不明白。

我使用 ItemLoader 来填充项目。有时我刮的页面不一致,并且我在 parse_item 函数中定义了缺少的xpath。结果,我得到了类似的东西(JSON格式):

[{
    "product_name": "Bonded top",
    "sizes": ["S", "L", "XL"],
    "product_url": "http://www.website.com/product/bonded-top"
}, {
    "product_name": "Red glasses",
    "product_url": "http://www.website.com/product/red-glasses"
}]

当我使用JSON时,这不是一个大问题,但是,如果我将项目导出到.csv,您可以想象的数据将会混合。这是一个小例子,我有更多的项目和数以千计的产品。某些项目可能会丢失("大小"在上面的示例中缺失)。

问题

将空字符串填充为键值的优雅方法是什么? {"尺寸":""}?我不完全理解,我应该在哪里配置,即使是空字符串也可以填充,因为我使用了ItemLoader?

我的配置如下:

class MytheresaItem(scrapy.Item):
    product_url = scrapy.Field(output_processor=TakeFirst())    
    product_name = scrapy.Field(output_processor=TakeFirst())
    sizes = scrapy.Field()

蜘蛛

class MytheresaSpider(CrawlSpider):
    name = 'website_products'
    allowed_domains = ["website.com"]
    start_urls = ['http://www.website.com/en/clothing.html']

    rules = (
        Rule(LinkExtractor(allow=(),
                       restrict_xpaths=('//div[@class="category-products"]/ul')),
         callback='parse_item',
         ),

        Rule(LinkExtractor(allow=(),
                       restrict_xpaths=('//div[@class="pages"]/ul/li[@class="next"]')),
         follow=True,
         ),
    )


def parse_item(self, response):
    i = ItemLoader(item=MytheresaItem(), response=response)

    i.add_value('product_url', response.url)

    i.add_xpath('sizes', '//div[@class="product-essential"] \
        /descendant::div[@class="product-options"] \
        /descendant::ul[@class="sizes"]/child::*/a/span/text()')

    i.add_xpath('product_name','//div[@class="product-essential"] \
        /descendant::div[@class="product-name"]/span/text()')

    return i.load_item()

0 个答案:

没有答案