camelotでPDFの表からEXCELに変換(CSV・TSV・XLSX)

厚生労働省ブラック企業リストをTSV変換

imabari.hateblo.jp

前回tabulaのは失敗するのでcamelotで再挑戦

Camelot: PDF Table Extraction for Humans — Camelot 0.7.3 documentation

厚生労働省長時間労働削減に向けた取り組みから www.mhlw.go.jp

労働基準関係法令違反に係る公表事案をダウンロード https://www.mhlw.go.jp/kinkyu/dl/180928.pdf

表の部分しか取れないので労働局名と最新更新日がありません

apt install ghostscript
pip install camelot-py[cv]
import re
import pandas as pd
import matplotlib.pyplot as plt

import camelot

# 2ページ目から最終頁まで、セパレーター優先、改行除去
tables = camelot.read_pdf('180928.pdf', pages='2-end', split_text=True, strip_text='\n')

dfs = []

# dataframeに変換、ヘッダー部削除、ヘッダー追加
for table in tables:
    df = table.df
    df.drop(0, inplace=True)
    df.columns = ['企業・事業場名称', '所在地', '公表日', '違反法条', '事案概要', 'その他参考事項']
    dfs.append(df)

# ページ結合
df_black = pd.concat(dfs)

# カンマを追加
def ihan_conv(temp):
    result = re.sub('条(の\d{1,3})?', lambda m: m.group(0) + ', ', temp).rstrip(', ')
    return result

def sonota_conv(temp):
    result = re.sub('H\d{1,2}\.\d{1,2}\.\d{1,2}', lambda m: ', ' + m.group(0), temp).lstrip(', ')
    return result

df_black['違反法条'] = df_black['違反法条'].apply(ihan_conv)
df_black['その他参考事項'] = df_black['その他参考事項'].apply(sonota_conv)

# CSVファイルへ出力
df_black.to_csv('black.csv')

# TSVファイルへ出力
df_black.to_csv('black.tsv', sep='\t' )

# EXCELファイルへ出力
with pd.ExcelWriter('black.xlsx') as writer:
    df_black.to_excel(writer, sheet_name='sheet1')

camelotは線できちんと囲まれているものは大丈夫そう。 2行で1つのセルのようなexcelで1つは線ありもう一つは文字オーバーして線が消えていると隣や上にくっついてしまうので難しい。