質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

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

PDF

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

7637閲覧

pdfminerを使って特定のテキストを抽出したい

hiroki_0926

総合スコア18

スクレイピング

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

PDF

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/08/30 06:04

#実現したいこと
ネットに落ちているコードを基に、pdfminerを使ってpdfの内容をスクレイピングするコードを書きました。こちらはworkしています。

一方で、特定の箇所のみスクレイピングしたい場合は最後のソースコードをどのように修正したら良いでしょうか?

初歩的な質問で恐縮ですが、ご教示頂けると助かります。

なお、windows7、python3.6.1を使用しています。
pdfはこちら↓
http://www.am-one.co.jp/pdf/report/2760/20170830JSMarketDaily.pdf
LTTextBoxHorizontal(67)、(68)、(69)のテキスト内容のみ取得したいです。

#コード
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfparser import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfparser import PDFPage
from pdfminer.pdfdevice import PDFDevice
from pdfminer.converter import PDFPageAggregator
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.layout import LTTextBoxHorizontal

fp = open(PDF_file, 'rb')

parser = PDFParser(fp)
document = PDFDocument()
parser.set_document(document)

password=""
document.set_parser(parser)
document.initialize(password)

rsrcmgr = PDFResourceManager()

laparams = LAParams()

device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)

pages = list(document.get_pages())
page_1 = pages[0]

interpreter.process_page(page_1)

layout = device.get_result()

for l in layout:
if isinstance(l, LTTextBoxHorizontal):
print(l.get_text())

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

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

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

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

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

guest

回答1

0

ベストアンサー

LTTextBoxHorizontal(67)、(68)、(69)のテキスト内容のみ

(67)、(68)、(69)何らかの順序位置を示しているとして回答します。
なおpdfminerおよび提示コードの詳細内容は確認しておりません。

以下のように、自身で順序位置posを算出し、if文で判定、抽出すればよいと思います。

layoutなるものの(全体の)順序位置の場合

Python

1pos = 0 2for l in layout: 3 if isinstance(l, LTTextBoxHorizontal): 4 if pos == 67 or pos == 68 or pos == 69: 5 print(l.get_text()) 6 pos = pos + 1

layoutなるものの中のLTTextBoxHorizontalだけの順序位置の場合

Python

1pos = 0 2for l in layout: 3 if isinstance(l, LTTextBoxHorizontal): 4 if pos == 67 or pos == 68 or pos == 69: 5 print(l.get_text()) 6 pos = pos + 1

投稿2017/08/30 06:28

can110

総合スコア38266

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

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

hiroki_0926

2017/08/30 06:56

早速ありがとうございます。問題なく抽出できました。 ただ、このpdfは発行日によって、LTTextBoxHorizontalの番号が変わっちゃうんですね。。
can110

2017/08/30 07:03

解決して何よりです。位置が不定の場合は、正規表現で判定する(必ずある文字を含む場合)、項目の相対位置(必ずタイトルの2つ後がその項目などの場合)で判定する、などさらに工夫する必要がありそうですね。
hiroki_0926

2017/08/30 07:56

LTTextBoxHorizontal(XX)の後に必ず、432.591,~~, ~~, ~~'というのがあるのですが、これを正規表現で判定するということでしょうか? 初歩的な質問でごめんなさい。正規表現を理解できていなくて。
can110

2017/08/30 08:58

そうですね。 「カンマが3つある」などは正規表現で判定できるので、その前を抽出するような感じになります。 いずれにせよ具体的なデータ構造(並び)に沿って判定(抽出)コードを書く必要があります。
hiroki_0926

2017/09/01 02:27

正規表現をどのように書いていいか分からず、お手上げ状態です(汗 具体的にどのように書いたらよいでしょうか?
can110

2017/09/01 05:34

具体的なデータの並びや文字列によりますので、別途質問を立てられたほうがよいです。 その際、(私も含め)pdfminerを導入していなくても検証できるようなデータ(LTTextBoxHorizontalで得られた全ての文字列など)、コードを示されると回答得られやすくなります。
hiroki_0926

2017/09/02 14:28

分かりました。別途質問を立てます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問