直接将内容发送到scrapy管道

时间:2016-10-01 18:43:30

标签: python scrapy

我正在使用scrapy。在我目前的项目中,我正在从pdf文件中捕获文本。我想将它发送到管道进行解析。现在我有:

def get_pdf_text(self, response):
    in_memory_pdf = BytesIO(bytes(response.body))
    in_memory_pdf.seek(0)
    doc = slate.PDF(in_memory_pdf)
    item =OveItem()
    item['pdf_text']=doc
    return item

pipelines.py

class OvePipeline(object):
    def process_item(self, item, spider):
       .......
        return item

这样可行,但我认为只是直接产生结果会更简洁,而不必将结果附加到项目以使其进入管道,例如:

def get_pdf_text(self, response):
    in_memory_pdf = BytesIO(bytes(response.body))
    in_memory_pdf.seek(0)
    yield slate.PDF(in_memory_pdf)

这可能吗?

1 个答案:

答案 0 :(得分:2)

根据Scrapy documentation,蜘蛛回调必须返回Request实例,字典(ies)或Item实例:

  

此方法以及任何其他请求回调必须返回   可迭代的Request和/或dicts或Item对象。

所以,如果你不想定义一个特殊的"项目"对于pdf内容,只需将其包装成dict:

def get_pdf_text(self, response):
    in_memory_pdf = BytesIO(bytes(response.body))
    in_memory_pdf.seek(0)

    doc = slate.PDF(in_memory_pdf)

    return {'pdf_text': doc}