2016-09-30 17 views
0

私はScrapyスパイダーを使って、slateを使ってディレクトリ内の複数のPDFファイルからテキストを抽出しようとしています。私は実際のPDFをディスクに保存することに興味がないので、io.bytesIOサブクラスhttps://docs.python.org/2/library/io.html#buffered-streamsを調べることをお勧めしました。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)を実行すると、読み取るバイト数を渡すことになっています。バッファを読み込みません。それはバイトを想定しているため

in_memory_pdf = BytesIO(response.body) 

のPython 3では、あなたは文字列でBytesIOを使用することはできません。BytesIOとして

のpython 2では、単に初期化します。エラーメッセージは、response.bodyがタイプstrであることを示しています。エンコードする必要があります。

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

しかし、PDFなどのバイナリデータすることができ、私はresponse.bodybytes、ないstrだろうと仮定します。その場合、簡単なin_memory_pdf = BytesIO(response.body)が機能します。

関連する問題