gpt4 book ai didi

python - Scrapy:使用 itemloader i.c.w 的最佳方式是什么? Postgres 管道?

转载 作者:行者123 更新时间:2023-11-29 13:30:33 26 4
gpt4 key购买 nike

我正在尝试使用 itemLoader 给 Scrapy 中的空项目一个默认值,就像在 items.py 中这样:

prod_specs = Field(
default=[],
input_processor=MapCompose(unicode_to_str, strip_tabs_new_lines),
)

所以如果 prod_specs 没有设置,它应该给它一个空对象。但它不起作用。如果我尝试使用 item['prod_specs'].

将字段存储到数据库中

我收到一条错误消息,告诉我 key 不存在:

exceptions.KeyError: 'prod_specs' 

如果其他字段未设置,则相同。我认为我使用的是 item['prod_specs'] 而不是 items.py 中的 itemLoader 导致了错误。但我不确定。

那么大家怎么看呢?您对此有解决方案吗?

最佳答案

编辑:官方文档似乎已过时,字段默认值不再有效(参见 https://github.com/scrapy/scrapy/issues/560 )。所以另一种选择是使用管道为项目分配默认值:

def parse_item(self, item, spider):
if "prod_specs" not in item: item['prod_specs'] = []
return item

或在 psycopg2 插入期间:

def parse_item(self, item, spider):
cur.execute("insert into mytable(prod_specs) values(%s)",
item.get('prod_specs',[]))
return

您正在尝试将 ItemLoader 用作项目。以下是设置项目和项目加载器的方法。

项目.py

from scrapy.item import Field, Item
from scrapy.contrib.loader.processor import MapCompose

class Product(Item):
prod_specs = Field(
default=[],
input_processor=MapCompose(unicode_to_str, strip_tabs_new_lines)
)

蜘蛛/myspider.py

from scrapy.contrib.loader import ItemLoader
from myproject.items import Product

def parse(self, response):
l = MyLoader(item=Product(), response=response)
l.add_xpath('prod_specs', '//div[@class="prod_specs"]')
return l.load_item()

如果您打算使用很多不同的项目,您应该继承 ItemLoader 并定义默认处理器。

这足以回答您的问题吗?你提到你想写一个 Postgres 管道。我发现最简单的方法是使用 SQLAlchemy,这样您就可以使用单个管道将任意数量的对象写入任意数量的数据库。

关于python - Scrapy:使用 itemloader i.c.w 的最佳方式是什么? Postgres 管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24694847/

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