pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

Python:VSCodeでPDFMinerを使って、東証株日報PDFから表抽出(1)


東証株日報PDFのテキスト抽出で少し前進がありました。

【PDFMinerで東証株日報PDFからテキスト抽出】
【PDFMinerで東証株日報PDFからテキスト抽出】

10/28追記:「まとめ」UP

東証株式相場表をDLし、PDFMinerでCSV化。「LOAD DATA INFILE」でMySQLへUP、というながれをまとめました。

前説:Java+tabula-pyでほぼ挫折していました。その後、PDFMinerでなんとかなるのではと思ってはみたものの…。

pagetaka.hatenablog.jp
pagetaka.hatenablog.jp
pagetaka.hatenablog.jp
前回までに、東証株日報表PDFからJavaとtabula-pyの組み合わせでテキスト抽出するのは、ほぼ挫折しました。これををあきらめ、次善の策としてPDFMinerでなんとかしようともがいてみました。

その結果、東証株日報PDFから全角・半角テキスト抽出は成功しましたが、縦罫線などに影響されるのか、銘柄コード、銘柄名などと株価が対になってテキスト抽出できない状態が続いていました。

現状:lprms = LAParams(boxes_flow=None) を使って縦罫線無視しテキスト抽出できました。

PDFMinerを使うにあたり、LAPARamsクラスを使ってレイアウト情報を利用してできるのではと検討していました。
参考にしたのは「【Python×PDF】PDFMinerライブラリでPDFからテキストを抽出方法【徹底解説】 | Pythonでもっと自由を」です。当初、行間値を適宜変更すれば、横一行を一連情報として取り出せるのではないかと試しましたがうまくいきませんでした。縦罫線をPDFMinerがレイアウトの重要な要素と認識しているのではないかと想像しました。罫線無視のパラメータはないみたいです。もともとPDFの罫線は結果その位置に罫線があるということで、Excelのセルのような強固な関係でもないのではないかと仮定し、「Composable API — pdfminer.six __VERSION__ documentation」にジャンプしパラメーターをボヤーッと見ておりました。

パラメータに「box_flow」というのがありました。説明は以下の通りでした。

box_flow – テキスト ボックスの順序を決定する際に、テキストの水平および垂直位置がどの程度重要かを指定します。値は -1.0 (水平位置のみが重要) から +1.0 (垂直位置のみが重要) の範囲内である必要があります。Noneを渡し て高度なレイアウト分析を無効にし、代わりにテキスト ボックスの左下隅の位置に基づいてテキストを返すこともできます。
出典:Composable API — pdfminer.six __VERSION__ documentation

「None」を設定すれば、レイアウト分析がキャンセルされるらしい…というのは吉報です。テキストボックスの左下、つまり、1行左端の1文字目の左下角を解析のスタートにしてくれる、ということで、東証株日報表PDFを、銘柄コード、銘柄名、株価の順にテキスト取得できました。

今後:改行が多く、若干の隘路もあるので、テキスト整理し、CSVに仕上げる作業が必要。

現状、テキスト抽出時、1銘柄分がCSV並びで1行に収まっている状態ではありません。東証株日報PDFの総てのデータが必要というわけでもありませんので破棄する部分(ページ・ヘッダ、市場・業種区分ほか)もありそうです。また、テキスト出力時改行がやたら多いので、これも整理する必要があります。Pythonで対応するスクリプトを書かなければ…。

行き詰まっていた作業ですが、少し、先が見えました。

9月6日追記:続編記事リンク

東証株相場表から約4000件のデータをCSVで保存できました。ソースは(3)に載せました。
pagetaka.hatenablog.jp
pagetaka.hatenablog.jp