2016-09-30 25 views
0

私は、スレート(https://pypi.python.org/pypi/slate)を使用して、ディレクトリ内の複数のPDFファイルを抽出しようとしている、スパイシースパイダーに取り組んでいます。私は実際のPDFをディスクに保存することに興味がないので、io.bytesIOサブクラスhttps://docs.python.org/2/library/io.html#buffered-streamsを調べることをお勧めしました。 Creating bytesIO objectに基づいて、私はbytesIOクラスをpdf本体で初期化しましたが、データをスレートモジュールに渡す必要があります。これまでのところ私が持っている:私は取得しています作成後にbytesIOオブジェクトにアクセスする

def save_pdf(self, response): 
    in_memory_pdf = BytesIO(response.body) 

    with open(in_memory_pdf, 'rb') as f: 
     doc = slate.PDF(f) 
     print(doc[0]) 

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

がどのように私はこの作業を得ることができますか?

編集:

with open(in_memory_pdf, 'rb') as f: 
TypeError: coercing to Unicode: need string or buffer, _io.BytesIO found 

編集2:

def save_pdf(self, response): 
    in_memory_pdf = BytesIO(bytes(response.body)) 
    in_memory_pdf.seek(0) 
    doc = slate.PDF(in_memory_pdf) 
    print(doc) 
+1

'in_memory_pdf = BytesIO(bytes(response.body))'を試してください。 – martineau

+1

ありがとう、これは最初の問題を解決しました! – user61629

+0

BytesIOの代わりに['StringIO'](https://docs.python.org/2/library/stringio.html#module-StringIO)を試してみてください。また、 'with open(...)as f'を必要とせず、作成後に' in_memory_pdf.seek(0) 'で巻き戻してから' in_memory_pdf'を使用してください。_instead_ of ' f 'である。 – martineau

答えて

1

あなたはすでに答えを知っています。これはPython TypeErrorメッセージに明記されており、ドキュメントから明らかです。

BytesIOはバイトを受け入れます。そしてあなたはそれを内容に渡しています。すなわち:response.bodyは文字列です。

+0

ありがとう、非常に有用な情報!私はin_memory_pdf = BytesIO(バイト(response.body))を上から使用しました。問題は今、私は上記のエラーが追加されています。 – user61629

+0

あなたの解決策は、エラーそのものによって与えられるものです。あなたはバイトの文字列を渡しています。エラーが示すようにintにコンサートします。バイトが働いているので、うまくいくはずです。 –

関連する問題