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"}
答案 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中查看更多内容。