Closed5

PythonでPDF内の表を読み取る(tabula-py)

kun432kun432

tablula-pyは以下のようなケースの場合、有用。

  • 画像ではなくテキストが埋め込んである
  • 表の構造をそのまま抜き出したい

引き続き、以下で公開されているJRAの過去の馬場情報(クッション値・含水率)についてのPDFを使ってみる。Colaboratoryで。

https://www.jra.go.jp/keiba/baba/archive/

2023年の東京競馬第1回のもの使う。

!wget https://www.jra.go.jp/keiba/baba/archive/2023pdf/tokyo01.pdf
kun432kun432

tabula-pyはtabula-javaのラッパーみたいなものの様子。ということで、Javaがインストールされているかを確認。

!java -version

colaboratoryでは最初から入っていた。

openjdk version "11.0.20.1" 2023-08-24
OpenJDK Runtime Environment (build 11.0.20.1+1-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.20.1+1-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

パッケージのインストール。PDFから読み込んだ表はpandasのデータフレームになるので、pandasが必要。

!pip install -q tabula-py pandas

tabula-pyはPDF内のすべての表を一つづつpandasのデータフレームにして配列で返すので、こんな感じでPDFを読み込む。

import tabula
import pandas as pd

dfs = tabula.read_pdf("tokyo01.pdf", pages="all")
for df in dfs:
    display(df)

pages="all"はPDFの全ページを対象とするオプション(デフォルトは1ページのみ)

結果はこうなる。

結合されたセル内の文字が別々のセルに分解されているのがわかる。これを表の線に近づけるにはlattice=Trueオプションを使う。

dfs = tabula.read_pdf("tokyo01.pdf", pages="all", lattice=True)

lattice=Trueオプションを使うとこうなる。

分かれていたセルが一つになっているのがわかる。ただ、その分詰められてしまってNaNになってしまっている。まあPandasにはセルの結合という概念はないと思うのでしょうがない。tabulaで読み込んでみてうまくいかないような複雑な表などで試してみると良いのではないか。

kun432kun432

tabula-pyはあくまでもPDF内の表(とその中身)を読み取るものなので、それ以外の部分は読んでくれない模様。なので、表の外側の文字も取りたい場合には他のライブラリと併用する必要がある。

このスクラップは2023/09/11にクローズされました