创建bytesIO对象。

6
我正在开发一个Scrapy爬虫,尝试从目录中的多个PDF文件中提取文本,使用slate。我没有兴趣将实际的PDF保存到磁盘上,因此有人建议我查看https://docs.python.org/2/library/io.html#buffered-streams中的io.bytesIO子类。
然而,我不确定如何将PDF正文传递给bytesIO类,然后传递虚拟PDF slate以获取文本。到目前为止,我做了以下工作:
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个回答

11
当您执行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.body应该是bytes而不是str。在这种情况下,简单的in_memory_pdf = BytesIO(response.body)就可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接