pagetakaBlog

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

Python:VSCodeでJavaを介在させ、東証株日報PDFから表抽出(2)

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

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

前説:東証株式日報(PDF版)をPythonで処理する準備。

tabula-pyで東証株式日報表の数字を処理しようと考え、前段階としてJavaをインストールしひとまずJavaが動いたみたいだ、というのを前記事で掲載しました。
pagetaka.hatenablog.jp

現状:tabulaインストールはできたようだがエラーがいろいろ出ている。

VSCodeにtabulaをインストールし、PDFを処理するのに役立つページを見つけました。設定項目もいくつか例示されていたので助かりました。
di-acc2.com

ということで、tabulaインストール方法とかは省略します。実際にVSCodeで動かしたPythonファイルは以下の通りです。

import pandas as pd
from tabula import read_pdf
import time
# pdf_path = 'https://www.mhlw.go.jp/content/10906000/000618483.pdf' #ネット上PDF
# pdf_path = 'C:\pyfiles\data\000618483.pdf' #パスエラーになるので↓のように変更
pdf_path = 'C:\\pyfiles\\data\\000618483.pdf'

# テキストテーブル取得
dfs = read_pdf(pdf_path,    # PDFファイル
    encoding = 'cp932',     #文字コード
    pages='1',              # 抽出ページ ※今回はallでも同結果
    guess=False,            # 分析部分の変更有無 ※今回はTrueでも同結果
    area="entire",          # ページの部分指定
    lattice=True,           # 格子区切りがPDF内にある場合の対応
    stream=False,           # ストリームモード
    password=None,          # パスワード
    multiple_tables=True    #複数テーブル(表)
    )
# https://di-acc2.com/system/rpa/8610/  #設定を参考にした頁

for df in dfs:
    time.sleep(1)   #非力なPCなのでチョット一服…。
    print(df) #表が一部崩れているが…。

実際に、いくつかネット上のPDFを処理しましたが、エラーがイロイロ出ます。PC上のPythonデータ用フォルダデスクトップ内のPDFもエラーが出ます。これが現在地点です。下は、encodingをコメントアウトしたときのエラーです。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8c in position 1: invalid start byte

今後:ひとまず「保留」「挫折」ということで他の道具を探してみます。

最初できていたことが翌日できなかったり、対象にするPDFにより結果が違ったり、安定しません。なので、tabula-pyを使うのを保留し、別の道具が無いか探してみたいと思います。

AdobeのAcrobatX Pro(すでにサポート終了ですけど)を使っています。他の形式のファイルへの書き出しができるのでそれを使ってExcelファイルにしてみたら、きれいにできていました。Excelになった後なら処理がしやすいよね~などと眺めているところです…自信はありませぬ。VBAをつかうことになるのか、はたまたPythonで何かやらかすのか…不明…爺の妄想はとん挫す…ということになる可能性が高そうです。

放置プレーになりそうです…。

17日追記:東証株式相場表でもやってみましたがエラーがでました…。

東証株式相場表の8月15日日報PDFでやってみましたがエラーになりました。
設定したパスは以下の通りです。

pdf_path = 'https://www.jpx.co.jp/markets/statistics-equities/daily/nlsgeu000006kpi1-att/stq_20220815.pdf'

エラーは次のように表示されました。

json.decoder.JSONDecodeError: Invalid \escape: line 1 column 4628 (char 4627)