from scrapy.loader import ItemLoader
from myproject.items import Product
def parse(self, response):
for i in new_fields:
l = ItemLoader(item=Product(), response=response)
# you can add data using CSS, XPath or values
l.add_xpath('name', '//div[@class="product_name"]')
l.add_css('stock', 'p#stock')
l.add_value('last_updated', 'today')
yield l.load_item()
2条答案
按热度按时间ncecgwcz1#
我建议在这种情况下使用项目加载器。你可以在文档页面https://docs.scrapy.org/en/latest/topics/loaders.html上阅读更多关于它的信息。
一般来说,它看起来像这样:
ifsvaxew2#
您的问题是,语句
new_item = item
不会创建item的副本。newitem
将仅是对item的引用,因此当您更新newitem["new_field"]
时,您也在更新item["new_field"]
。因此,产出的项目始终相同,但每次产出时其状态都不同。因此,以下代码应打印new_field的不同值:
另一方面,下面的代码将只打印一个值:
在第二个例子中,
new_items
将是同一个项目的n个示例的列表(因为sub总是产生相同的项目,如前所述)。因此,随着对该项目的每次更新,列表中的所有项目都会发生变化。解决这个问题最简单的方法是把new_item变成item的真实的副本,具体的工作方式取决于item是什么,可能只需要写
new_item = item.copy()
就可以了,也可能需要使用python的copy
模块中的copy
或deepcopy
。