2016-09-30 105 views
0

我正在使用Scrapy蜘蛛,试图使用slate从目录中的多个PDF文件中提取文本。我没有兴趣将实际的PDF保存到磁盘,因此我建议查看https://docs.python.org/2/library/io.html#buffered-streams的io.bytesIO子类。创建bytesIO对象

但是我不确定如何将PDF正文传递给bytesIO类,然后传递虚拟PDF文件以获取文本。到目前为止,我有:

class Ove_Spider(BaseSpider): 

    name = "ove" 


    allowed_domains = ['myurl.com'] 
    start_urls = ['myurl/hgh/'] 


    def parse(self, response): 
     for a in response.xpath('//a[@href]/@href'): 
      link = a.extract() 
      if link.endswith('.pdf'): 
       link = urlparse.urljoin(base_url, link) 
       yield Request(link, callback=self.save_pdf) 

    def save_pdf(self, response): 

     in_memory_pdf = BytesIO() 
     in_memory_pdf.read(response.body) # Trying to read in PDF which is in response body 

我越来越:

in_memory_pdf.read(response.body) 
TypeError: integer argument expected, got 'str' 

我怎样才能得到这个工作?

回答

1

当你做in_memory_pdf.read(response.body)你应该通过读取的字节数。你想初始化缓冲区,而不是读入缓冲区。

在Python 2,只是初始化BytesIO为:

in_memory_pdf = BytesIO(response.body) 

在Python 3,你不能因为它预计字节使用BytesIO一个字符串。错误消息显示response.body的类型为str:我们必须对其进行编码。

in_memory_pdf = BytesIO(bytes(response.body,'ascii')) 

但作为一个PDF格式可以是二进制数据,我想这response.bodybytes,不str。在那种情况下,简单的in_memory_pdf = BytesIO(response.body)工作。