【问题标题】:scrapy item loader return list not single valuescrapy 项目加载器返回列表不是单个值
【发布时间】:2014-07-16 15:28:37
【问题描述】:

我正在使用scrapy 0.20。

我想使用物品加载器

这是我的代码:

l = XPathItemLoader(item=MyItemClass(), response=response)
        l.add_value('url', response.url)
        l.add_xpath('title',"my xpath")
        l.add_xpath('developer', "my xpath")
return l.load_item()

我在 json 文件中得到了结果。 url 是一个列表。 title 是一个列表。 developer 是一个列表。

如何提取单个值而不是列表?

我应该为此创建一个项目管道吗?我希望有更快的方法

【问题讨论】:

    标签: python python-2.7 web-scraping scrapy


    【解决方案1】:

    您需要设置一个Input or Output processorTakeFirst 在您的情况下可以完美运行。

    您可以在多个地方定义它,例如在Item 定义中:

    from scrapy.item import Item, Field
    from scrapy.loader.processors import TakeFirst
    
    class MyItem(Item):
        url = Field(output_processor=TakeFirst())
        title = Field(output_processor=TakeFirst())
        developer = Field(output_processor=TakeFirst())
    

    或者,在XpathItemLoader() 实例上设置default_output_processor

    l.default_output_processor = TakeFirst()
    

    【讨论】:

    • 优秀。 +1 一旦系统允许,我将接受。但是请问您提供的两种方式有什么区别?
    • 另外,如果列表为空,是否有类似的方法来设置输出?因为现在我将null 作为空属性的值。例如,某些页面没有title 属性,不是我得到nul,而是在我刚刚得到""之前
    • @MarcoDinatsoli 好吧,说到区别,Declaring Input and Output Processors 解释了输入和输出处理器的优先级。 Item 类字段可以被多个加载器重用,并且哪个加载器可以有自己的方式来呈现爬取的数据。我会在加载程序上定义处理器,而不是在你的情况下的项目字段上。
    • @MarcoDinatsoli 尝试使用Join 而不是TakeFirst,但请确保列表中只有一个值。
    • 你能在这里检查我的问题吗stackoverflow.com/questions/24109713/…
    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2018-05-01
    • 2014-10-03
    • 2012-08-09
    • 2018-03-19
    • 2022-01-22
    相关资源
    最近更新 更多