-1

有人可以向我解释一下吗?
在我的蜘蛛中,我有使用 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'>

我明白这一点,我把它作为一个字符串(Unicode),因为我使用了 .extract_first() 这就是我想要的。

但在我的管道中,

print "item['price_euro']", item['price_euro'], type(item['price_euro'])

我有它作为一个列表

item['price_euro'] [u'25.500 '] <type 'list'>

这对我来说不是什么大问题,但它很烦人,因为每次我想访问它时,我都需要在它的末尾添加 [0]。例如。项目['price_euro'][0]

我可以禁用它吗?我应该禁用它吗?
这背后的逻辑是什么?

谢谢

我如何添加 price_euro

l = ItemLoader(item=MyItem(), response=response)
l.add_value('price_euro', price_euro)      
yield l.load_item()   
4

1 回答 1

3

允许对同一个字段多次ItemLoader调用add_value()(以及add_css()add_xpath())。当您要查找的信息可以在 HTML 源的多个位置找到时,或者当请求之间的 HTML 布局不同时,这很有用。为了适应这一点,项目加载器将所有字段值存储在列表中。

当您期望该字段只有一个值(至于您的价格信息)时,您可以load_item()通过指定输出处理器来告诉项目加载器在调用时如何转换列表。执行此操作的规范方法是对类进行子ItemLoader类化:

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst

class MyItemLoader(ItemLoader):
    default_item_class = MyItem
    price_euro_out = TakeFirst()

然后,您可以像以前一样填充此项目加载器,另外的好处是您不再需要告诉项目加载器使用哪种项目类型:

l = MyItemLoader(response=response)
l.add_value('price_euro', price_euro)      
yield l.load_item()  

对于您发布的示例代码,您甚至可以避免通过该add_xpath()方法手动提取并将add作为selector关键字参数传递给项目加载器:

l = MyItemLoader(selector=add)
l.add_xpath('price_euro', './/strong[@class="price price--eur"]/text()')      
yield l.load_item()  

如果您想为您的项目的所有字段启用此“获取第一个列表元素”行为,您还可以为您的项目加载器声明一个默认输出处理器:

class MyItemLoader(ItemLoader):
    default_item_class = MyItem
    default_output_processor = TakeFirst()

Scrapy 文档有一个内置处理器列表

于 2017-11-07T11:43:20.293 回答