为什么我的scrapy输出结果是数组

时间:2017-06-07 06:42:34

标签: python scrapy

Scrapy似乎会将我的输出从dict格式化为数组,而我需要的只是字符串对象。输出:

{"title": ["some title some title"], "url": ["https://www.example.com/"], "upDate": ["2017/06/07 10:23:00"]}

和代码:

    l = ItemLoader(item=RoomInfoItem(), response=response)
    updateStr = '2017-' + res.css('td[class="time"]::text').extract_first() 
    l.add_value('upDate', upDateStr)
    ownerurl = response.css('span[class="from"] a::attr(href)').extract_first()
    l.add_value('ownerUrl', ownerurl)
    title = response.css('div[id="content"] h1::text').extract_first()
    l.add_value('title', title)
    yield l.load_item()

在为项添加新值时的scrapy资源,scrapy会通过scrapy.utils.misc.arg_to_iter()将参数转换为可迭代的。 如果有任何其他方法可以为项添加值而不更改值数据结构? 我想要的输出可能如下所示:

{"title": "some title some title", "url": "https://www.example.com/", "upDate": "2017/06/07 10:23:00"}

2 个答案:

答案 0 :(得分:0)

好吧,我通过放弃使用ItemLoader对象来解决这个问题。我直接使用该项,不会自动更改我的数据结构。 代码:

item=RoomInfoItem()
item['url'] = resUrl
item['upDate'] = upDateStr
item['title'] = title
yield item

答案 1 :(得分:0)

它是ItemLoader对象的标准行为。 要进行更改,您应该创建子对象并使用 default_output_processor = TakeFirst()

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Join

    ... YOUR CODE...

    l = YourLoader(item=RoomInfoItem(), response=response)

class YourLoader(ItemLoader):

    default_output_processor = TakeFirst()

    title_in = MapCompose(unicode.title)
    url_in = MapCompose(unicode.strip)

您可以在scrapy docs here中查看更多内容。