首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建bytesIO对象

创建bytesIO对象
EN

Stack Overflow用户
提问于 2016-09-30 19:43:08
回答 1查看 9.8K关注 0票数 3

我正在开发一个刮痕爬行器,试图使用石板从一个目录中的多个PDF文件中提取文本。我没有兴趣将实际的PDF保存到磁盘中,因此建议我查看https://docs.python.org/2/library/io.html#buffered-streamshttps://docs.python.org/2/library/io.html#buffered-streams子类。

但是,我不知道如何将PDF传递给bytesIO类,然后传递虚拟PDF模板来获取文本。到目前为止,我已经:

代码语言:javascript
运行
复制
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

我得到了:

代码语言:javascript
运行
复制
in_memory_pdf.read(response.body)
TypeError: integer argument expected, got 'str'

我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-30 19:48:49

当您执行in_memory_pdf.read(response.body)时,您应该传递要读取的字节数。您希望初始化缓冲区,而不是读入缓冲区。

在python 2中,只需将BytesIO初始化为:

代码语言:javascript
运行
复制
 in_memory_pdf = BytesIO(response.body)

在Python3中,您不能在字符串中使用BytesIO,因为它需要字节。错误消息显示response.bodystr类型的:我们必须对它进行编码。

代码语言:javascript
运行
复制
 in_memory_pdf = BytesIO(bytes(response.body,'ascii'))

但是,由于pdf可以是二进制数据,我想response.body应该是bytes,而不是str。在这种情况下,简单的in_memory_pdf = BytesIO(response.body)可以工作。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39799009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档