🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

981閲覧

「スクレイピング・ハッキング・ラボ pythonで自動化する未来型生活」の6章で上手くいきません。

samayou8

総合スコア5

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/03/17 05:22

「スクレイピング・ハッキング・ラボ pythonで自動化する未来型生活」の写経をしています。
6.11「PDFをスクレイピングする」でエラーが出てしまいます。

python

1from pdfminer.pdfinterp import PDFResourceManager,PDFPageInterpreter 2from pdfminer.converter import TextConverter 3from pdfminer.layout import LAParams 4from pdfminer.pdfpage import PDFPage 5 6input_path="filename.pdf" 7output_path="result.txt" 8 9rsrcmgr=PDFResourceManager() 10codec="utf-8" 11params=LAParams() 12 13with open(output_path,"ab")as output: 14 device=TextConverter(rsrcmgr,output,codec=codec,laparams=params) 15 16with open(input_path,"rb")as input: 17 interpreter =PDFPageInterpreter(rsrcmgr,device) 18 for page in PDFPage.get_pages(input): 19 interpreter.process_page(page) 20 21device.close()

とすると、


ValueError Traceback (most recent call last)
<ipython-input-37-4a56e0a6e7c9> in <module>
2 interpreter =PDFPageInterpreter(rsrcmgr,device)
3 for page in PDFPage.get_pages(input):
----> 4 interpreter.process_page(page)
5
6 device.close()

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/pdfinterp.py in process_page(self, page)
894 self.device.begin_page(page, ctm)
895 self.render_contents(page.resources, page.contents, ctm=ctm)
--> 896 self.device.end_page(page)
897 return
898

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in end_page(self, page)
52 self.cur_item.analyze(self.laparams)
53 self.pageno += 1
---> 54 self.receive_layout(self.cur_item)
55 return
56

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in receive_layout(self, ltpage)
212 if self.showpageno:
213 self.write_text('Page %s\n' % ltpage.pageid)
--> 214 render(ltpage)
215 self.write_text('\f')
216 return

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in render(item)
202 if isinstance(item, LTContainer):
203 for child in item:
--> 204 render(child)
205 elif isinstance(item, LTText):
206 self.write_text(item.get_text())

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in render(item)
202 if isinstance(item, LTContainer):
203 for child in item:
--> 204 render(child)
205 elif isinstance(item, LTText):
206 self.write_text(item.get_text())

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in render(item)
202 if isinstance(item, LTContainer):
203 for child in item:
--> 204 render(child)
205 elif isinstance(item, LTText):
206 self.write_text(item.get_text())

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in render(item)
204 render(child)
205 elif isinstance(item, LTText):
--> 206 self.write_text(item.get_text())
207 if isinstance(item, LTTextBox):
208 self.write_text('\n')

/opt/anaconda3/lib/python3.7/site-packages/pdfminer/converter.py in write_text(self, text)
195 if self.outfp_binary:
196 text = text.encode()
--> 197 self.outfp.write(text)
198 return
199

ValueError: write to closed file


このようにエラーになってしまいます。
色々探してみたのですが、解決方法がわかりませんでした。
拙い質問ですが、御教授いただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

python

1with open(output_path,"ab")as output: 2 device=TextConverter(rsrcmgr,output,codec=codec,laparams=params) 3 with open(input_path,"rb")as input: 4 interpreter =PDFPageInterpreter(rsrcmgr,device) 5 for page in PDFPage.get_pages(input): 6 interpreter.process_page(page) 7 device.close()

投稿2021/03/17 05:49

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2021/03/17 05:51

書いてる間に、同じ内容の回答が既に投稿されてました 失礼しました
samayou8

2021/03/17 06:51

いえいえ、ご丁寧にありがとうございました
guest

0

ベストアンサー

インデントがずれていたので、2個目のwithが1個目のwithの外側に出ていました。withを抜けるとファイルが閉じられてしまうので、ValueError: write to closed fileが出ていたのだろうと思います。
下記でいかがでしょうか。

python3

1from pdfminer.pdfinterp import PDFResourceManager,PDFPageInterpreter 2from pdfminer.converter import TextConverter 3from pdfminer.layout import LAParams 4from pdfminer.pdfpage import PDFPage 5 6input_path="filename.pdf" 7output_path="result.txt" 8 9rsrcmgr=PDFResourceManager() 10codec="utf-8" 11params=LAParams() 12 13with open(output_path,"ab")as output: 14 device=TextConverter(rsrcmgr,output,codec=codec,laparams=params) 15 16 with open(input_path,"rb")as input: 17 interpreter =PDFPageInterpreter(rsrcmgr,device) 18 for page in PDFPage.get_pages(input): 19 interpreter.process_page(page) 20 21 device.close()

投稿2021/03/17 05:36

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

samayou8

2021/03/17 05:38

ありがとうございます。 ご提示頂いた方法で解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問