如何将多个已删除的项目合并为一个? (Scrapy)

时间:2014-12-03 06:27:57

标签: python web-scraping css-selectors scrapy

假设我想使用选择器

http://doc.scrapy.org/en/latest/_static/selectors-sample1.html抓取文本
response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

从这里,我得到了项目清单

 [u'My image 1',
 u'My image 2',
 u'My image 3',
 u'My image 4',
 u'My image 5']

如何合并此列表中的内容,使其显示为由​​短划线分隔的单行?

 [u'My image 1 - My image 2 - My image 3 - My image 4 - My image 5']

所以我在python中有某种forloop?或者,当我从.json文件中提取数据时,我是否必须手动连接每个?

如果您需要澄清任何事情,请告诉我!

1 个答案:

答案 0 :(得分:3)

你应该使用所谓的ItemLoaderdoc)。基本上,这允许您在将数据放入Item之前对数据执行其他操作。使用您的示例网址查看此代码:

from scrapy.item import Item, Field
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import Join

class FooItem(Item):
    images = Field()

class FooLoader(ItemLoader):
    images_out = Join(' - ')

然后,在您的蜘蛛/抓取工具的parse()方法中:

# get the data
sel = Selector(response)
data = sel.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

# load the data and yield an item
my_loader = FooLoader(item=FooItem())
my_loader.add_value('images', data)  # should be the list of strings in your example
yield my_loader.load_item()

以下是您应该看到的输出:

{'images': u'My image 1  - My image 2  - My image 3  - My image 4  - My image 5 '}

这样做的原因是ItemLoader类接受了类中每个字段所谓的processor。常见的是TakeFirst(它采用第一个匹配的值)和Join(使用提供的字符串连接多个值,或者默认情况下为空格)。还有其他内容,例如MapComposeIdentity,您也可以构建自己的内容。您只需指定字段名称和“_in”或“_out”,具体取决于您计划使用的处理器类型(输入或输出)。在这种情况下,我将加载器的字段命名为images_out,因为我希望在使用images返回(输出)值后处理FooItem的Join字段。

最后,您可能计划产生一个项目,因此ItemLoader的load_item()方法就是这样做:返回一个项目。