代码之家  ›  专栏  ›  技术社区  ›  WebOrCode

为什么在刮擦的文本是作为字符串在蜘蛛,但作为列表在管道?

  •  -1
  • WebOrCode  · 技术社区  · 8 年前

    谁能给我解释一下吗?
    在我的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'>
    

    但在我的管道中,

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

    我有一张清单

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

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

    我可以禁用它吗?我应该禁用吗?

    非常感谢。

    如何添加price_euro

    l = ItemLoader(item=MyItem(), response=response)
    l.add_value('price_euro', price_euro)      
    yield l.load_item()   
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Jakob de Maeyer    8 年前

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

    当您希望字段只有一个值(与价格信息一样)时,您可以告诉项目加载器在以下情况下如何转换列表: load_item() output processor . 实现这一点的规范方法是将 类别:

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

    对于您发布的示例代码,您甚至可以通过 添加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()
    

    刮痧医生有一个 list of built-in processors .

    推荐文章