scrapy 项目加载器返回列表不是单个值

Posted

技术标签:

【中文标题】scrapy 项目加载器返回列表不是单个值【英文标题】:scrapy item loader return list not single value 【发布时间】: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 是一个列表。

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

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

【问题讨论】:

【参考方案1】:

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

您可以在多个地方定义它,例如在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,但请确保列表中只有一个值。 你能在这里检查我的问题吗***.com/questions/24109713/…

以上是关于scrapy 项目加载器返回列表不是单个值的主要内容,如果未能解决你的问题,请参考以下文章

findById 返回文档列表而不是单个结果

Okta Pass 角色列表而不是单个值?

当带有 extract() 的 Scrapy 选择器返回 None 时如何设置默认值?

如何使用 Java lambda 遍历列表映射并返回单个值? [复制]

Hibernate query.list() 方法返回空列表而不是空值

html 使用AJAX POST请求来调用控制器操作(在页面加载时和在下拉列表中选择项目时),获取返回的布尔值,设置observabl