Scrapy 为什么在刮擦刮文本是作为字符串在蜘蛛,但作为列表在管道?
谁能给我解释一下吗Scrapy 为什么在刮擦刮文本是作为字符串在蜘蛛,但作为列表在管道?,scrapy,scrapy-spider,scrapy-pipeline,Scrapy,Scrapy Spider,Scrapy Pipeline,谁能给我解释一下吗 在我的spider中,我有使用XPath提取数据的代码 price_euro = add.xpath('.//strong[@class="price price--eur"]/text()').extract_first() print 'price_euro', price_euro, type(price_euro) 我得到的是: price_euro 25.500 <type 'unicode'> 我把它列在清单上 item['price_euro'
在我的spider中,我有使用XPath提取数据的代码
price_euro = add.xpath('.//strong[@class="price price--eur"]/text()').extract_first()
print 'price_euro', price_euro, type(price_euro)
我得到的是:
price_euro 25.500 <type 'unicode'>
我把它列在清单上
item['price_euro'] [u'25.500 '] <type 'list'>
ItemLoader
允许对同一字段多次调用add_value()
(以及add_css()
和add_xpath()
)。当您要查找的信息可以在HTML源的多个位置找到时,或者当请求之间的HTML布局不同时,这非常有用。为了适应这种情况,项目加载器将所有字段值存储在列表中
如果您希望字段正好有一个值(与价格信息一样),则可以通过指定一个值来告诉项目加载器在调用load\u item()
时如何转换列表。实现这一点的标准方法是将ItemLoader
类子类化:
从scrapy.loader导入ItemLoader
从scrapy.loader.processors导入TakeFirst
类MyItemLoader(ItemLoader):
默认\u项目\u类=MyItem
价格\欧元\出局=TakeFirst()
然后,您可以像以前一样填充此项目加载器,这样您就不必再告诉项目加载器要使用哪种项目类型了:
l=MyItemLoader(响应=response)
l、 增加价值(“价格欧元”,价格欧元)
产量l.装载量_项()
对于您发布的示例代码,您甚至可以通过add_xpath()
方法避免手动提取,并将add
作为selector
关键字参数传递给项目加载器:
l=MyItemLoader(选择器=add)
l、 添加xpath('price_euro','。//strong[@class=“price price--eur”]/text()
产量l.装载量_项()
如果要为项目的所有字段启用此“获取第一个列表元素”行为,还可以为项目加载器声明默认输出处理器:
类MyItemLoader(ItemLoader):
默认\u项目\u类=MyItem
默认输出处理器=TakeFirst()
刮痧文档有一个。您在哪里为项目分配价格?整个项目打印出来时是什么样子的?@omu_negrou我在问题中添加了代码。谢谢你的回答,现在认为有意义了。为了解决这个问题,我做了一个管道来获得唯一的第一件事。上周我使用了Scrapy,它是一个非常好的框架,一旦你理解了它背后的逻辑。我将尝试使用这种方法。
item['price_euro'] [u'25.500 '] <type 'list'>
l = ItemLoader(item=MyItem(), response=response)
l.add_value('price_euro', price_euro)
yield l.load_item()