假设我想使用选择器
从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文件中提取数据时,我是否必须手动连接每个?
如果您需要澄清任何事情,请告诉我!
答案 0 :(得分:3)
你应该使用所谓的ItemLoader
(doc)。基本上,这允许您在将数据放入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
(使用提供的字符串连接多个值,或者默认情况下为空格)。还有其他内容,例如MapCompose
和Identity
,您也可以构建自己的内容。您只需指定字段名称和“_in”或“_out”,具体取决于您计划使用的处理器类型(输入或输出)。在这种情况下,我将加载器的字段命名为images_out
,因为我希望在使用images
返回(输出)值后处理FooItem的Join
字段。
最后,您可能计划产生一个项目,因此ItemLoader的load_item()
方法就是这样做:返回一个项目。