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