我有一个对象,我正在尝试使用itemLoader填充它:
{
"domains": "string",
"date_insert": "2016-12-23T11:25:00.213Z",
"title": "string",
"url": "string",
"body": "string",
"date": "2016-12-23T11:25:00.213Z",
"authors": [
"string"
],
"categories": [
"string"
],
"tags": [
"string"
],
"stats": {
"views_count": 0,
"comments_count": 0
}
}
这是我的items.py文件:
class StatsItem(scrapy.Item):
views_count=scrapy.Field()
comments_count=scrapy.Field()
class ArticleItem(scrapy.Item):
domain = scrapy.Field()
date_insert=scrapy.Field()
date_update=scrapy.Field()
date=scrapy.Field()
title=scrapy.Field()
url=scrapy.Field()
body=scrapy.Field(
output_processor=Join())
date=scrapy.Field()
authors=scrapy.Field(
output_processor=Identity())
categories=scrapy.Field(
output_processor=Identity())
tags=scrapy.Field()
stats=scrapy.Field()
我的爬虫的一部分:
def parse(self, response):
loader = ArticleItemLoader(response=response)
parsed_uri = urlparse(response.url)
domain = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
loader.add_css('authors','span.meta-author')
loader.add_css('title', 'h1.title-article')
loader.add_value('url', response.url)
loader.add_xpath('date_insert', '//div[@class=\'meta\']/time[@itemprop=\'datePublished\']/@datetime')
loader.add_xpath('date_update', '//div[@class=\'meta\']/time[@itemprop=\'dateModified\']/@datetime')
loader.add_value('domain', domain)
loader.add_xpath('categories', '//ul[@class=\'breadcrumbs\']//li[not(contains(@class, \'home\'))]')
到目前为止,我已经成功填充了每个字段,但是“stats”字段还没有。我查看了这个页面correct way to nest Item data in scrapy,但似乎不再起作用(我无法使其工作,我的错误是TypeError:to_unicode必须接收一个字节、字符串或Unicode对象,得到StatsItem)。
我想使用itemLoader,但我不知道如何使用StatsItem来填充我的“stats”字段。
感谢您的帮助。 编辑 我已经接近成功,但仍然不起作用:
loader.add_value('stats', self.getStats(response))
def getStats(self, response):
statsLoader = StatsItemLoader(response=response)
statsLoader.add_xpath('comments_count', '//div[@class=\'btn-count\']//a/text()')
statsLoader.add_value('views_count', '42')
return json.dumps(dict(statsLoader.load_item()))
但是我的输出结果却像这样: { [...] "stats": "{\"comments_count\": \"0\", \"views_count\": \"42\"}" }
ArticleItem
的stats
属性中包含Field(serializer=MetaItem)
。 - eLRuLLprocessor
,因为我已经设置了 Item Loader 的默认值。 - RogerFromSpaceparse
方法内部)? - eLRuLLloader.add_value('stats', self.getStats(response))
和方法本身:def getStats(self, response): statsLoader = StatsItemLoader(response=response) statsLoader.add_xpath('comments_count', '//div[@class=\'btn-count\']//a/text()') return json.dumps(list(statsLoader.load_item()))
- RogerFromSpacestatsLoader.load_item()
,无需使用json.dumps
。 - eLRuLL