gpt4 book ai didi

python - scrapy:使用 itemLoader 填充嵌套项目

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:22 25 4
gpt4 key购买 nike

我有这个对象,我正在尝试用 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 必须接收字节、str 或 unicode 对象,得到 StatsItem)

我想使用 itemLoader,但我不知道如何用我的 StatsItem 填充我的“统计信息”

感谢帮助

编辑我很接近,但它仍然不起作用:

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()))

但我的输出是这样的: { [...] “统计”:“{\”评论计数\“:\”0\“,”views_count\“:\”42\“}”

最佳答案

感谢@eLRuLL,我设法找到了一个不错的解决方案:

项目.py :

class StatsItem(scrapy.Item):
views_count=scrapy.Field()
comments_count=scrapy.Field()

class ArticleItem(scrapy.Item):
[...]
stats=scrapy.Field(
input_processor=Identity())


class StatsItemLoader(ItemLoader):
default_input_processor=MapCompose(remove_tags)
default_output_processor=TakeFirst()
default_item_class=StatsItem

蜘蛛.py:

def parse(self, response):
[...]
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 dict(statsLoader.load_item())

最初它不起作用,因为我的 input_processor 是用于统计字段的 MapCompose(remove_tags)。为了序列化对象,您必须 return dict(loader.load_item()) 而不仅仅是 return loader.load_item()

谢谢!

关于python - scrapy:使用 itemLoader 填充嵌套项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41333735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com