我正在开发一个刮痕爬行器,试图使用石板从一个目录中的多个PDF文件中提取文本。我没有兴趣将实际的PDF保存到磁盘中,因此建议我查看https://docs.python.org/2/library/io.html#buffered-streams的https://docs.python.org/2/library/io.html#buffered-streams子类。
但是,我不知道如何将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'
我该怎么做呢?
发布于 2016-09-30 19:48:49
当您执行in_memory_pdf.read(response.body)
时,您应该传递要读取的字节数。您希望初始化缓冲区,而不是读入缓冲区。
在python 2中,只需将BytesIO
初始化为:
in_memory_pdf = BytesIO(response.body)
在Python3中,您不能在字符串中使用BytesIO
,因为它需要字节。错误消息显示response.body
是str
类型的:我们必须对它进行编码。
in_memory_pdf = BytesIO(bytes(response.body,'ascii'))
但是,由于pdf可以是二进制数据,我想response.body
应该是bytes
,而不是str
。在这种情况下,简单的in_memory_pdf = BytesIO(response.body)
可以工作。
https://stackoverflow.com/questions/39799009
复制相似问题