PDFから取得した時刻表テキストから、使いやすいデータを抽出する

気温の変化の激しさに負け、風邪をひいて喉が痛いです。
週末を風邪でぐったり過ごすと損した気分です!

さて、地道に作成しているPebbleの札幌東豊線の時刻表アプリ、を動かすために必要なデータを作るためにチマチマ進めている PDFからテキストを取得する PyPDF2 の続きです。

ソース

planset/tohosendata です。

やはりこういった電車の時刻表はオープンデータ化してほしいですね。
どこかにあるのかなー?

テキストから時刻表を抽出する

前回、PDFからテキストを取得することができました。

[code]
WeekdaysSaturdays/Sundays/Holidays6 01020293846546 01020293847557 2 91419232731353943475155597 311192632384450568 3 711151923273135394347528 2 8142026334047549 0 7152230374451599 2 91724313845525910 61320273542495610 71421283542495611 31118253239465411 31118253239465412 1 81522303744515812 1 81522303744515813 61320273441495613 61320273441495614 31017253239465314 31017253239465315 1 81522303744525915 1 81522293644515816 6132128354146525716 51220273441485617 3 813182329344045515617 31017243139465318 1 6121723283439455218 0 71522293643515919 0 816243240485619 715243240485620 412202937455320 412202937455321 1 917253341495721 1 917253341495722 5132230405022 5132230405023 0102030405023 010203040500 00 0Last Trains for Transfers from This Station.For MiyanosawaFor FukuzumiFor Shin sapporoTransfer at OdoriTransfer at SapporoTransfer at OdoriTransfer at Odori
[/code]

ここからうまい具合に抽出しますが、詳細は省略。

正規表現でざっくり分けて、あとは1時刻ずつ読む感じです(うまく行ってる気がしません)。

苦労した点は、pdfをテキストに変換をすると、
同じ行が2回続いて出力されるPDFがあることです・・・。
PDFの作りの問題なのか、pypdf2の使い方の問題なのか・・・。

栄町分を出力してみるとこんな感じです。時刻表が正しいかはまだ確認していません。

[code]
“1”: {
“fukuzumi”: {
“holiday”: {
“23”: [
0,
10,
20,
30,
40,
50
],
“22”: [
5,
13,
22,
30,
40,
50
],
(省略)
},
“weekday”: {
“23”: [
0,
10,
20,
30,
40,
50
],
“22”: [
5,
13,
22,
30,
40,
50
],
(省略)
}
(省略)
[/code]

ここまでくればもうおっけーです。

あとは、django用のdbに取り込んで時刻検索して返してあげています。

まとめ

これで時刻表のデータが揃ったので、あとは電車に乗りながら動作確認です。
栄町<>さっぽろ間しか乗ることがないので、福住のデータは一生テストされませんけどね!

PDFからテキストを取得する PyPDF2

昨日の札幌は風が強かったです。うちのゴミ箱のフタが飛んでいきました。

さて、地道に作成しているPebbleの札幌東豊線の時刻表アプリなのですが、それになりに動くようになって、平日の栄町駅だけは使えるようになりました。

位置によって最寄りの駅に切り替わることも確認できたので、あとは時刻表データを作るだけです。

いつもスマホで時刻表を見るときは [札幌市営]東豊線の時刻表 – えきから時刻表 を使っているのですが、データだけ抜くのは忍びないので、市が出している何かを参考にすることにしました。

地下鉄路線図・時刻表/札幌市

しかし見渡した限り全部PDFです。おーのー!

ただ、このPDFはテキスト情報が含まれているPDFなので、
この文字を使えば、簡単に時刻表(の文字列)をゲットできて楽ができるかもしれない!!!

本題:pythonでPDFからテキスト情報を取得しよう

pythonからPDFを扱うにはPyPDF2を使います。

mstamy2/PyPDF2

インストール

[code]
pip install pypdf2
[/code]

PDFからテキストを取得する

[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

import PyPDF2

def get_pdf_text(path):
"""PDFファイルからテキスト情報を抜き出す"""
text = ""
pdf = PyPDF2.PdfFileReader(open(path, "rb"))
for i in range(0, pdf.getNumPages()):
text += pdf.getPage(i).extractText() + "\n"
text = " ".join(text.replace(u"\xa0", " ").strip().split())
return text

if __name__ == ‘__main__’:
print(get_pdf_text(‘hogehoge.pdf’))

[/python]

実行してみる

これを東豊線の栄町駅PDFに対して実行してみます。

[code]
WeekdaysSaturdays/Sundays/Holidays6 01020293846546 01020293847557 2 91419232731353943475155597 311192632384450568 3 711151923273135394347528 2 8142026334047549 0 7152230374451599 2 91724313845525910 61320273542495610 71421283542495611 31118253239465411 31118253239465412 1 81522303744515812 1 81522303744515813 61320273441495613 61320273441495614 31017253239465314 31017253239465315 1 81522303744525915 1 81522293644515816 6132128354146525716 51220273441485617 3 813182329344045515617 31017243139465318 1 6121723283439455218 0 71522293643515919 0 816243240485619 715243240485620 412202937455320 412202937455321 1 917253341495721 1 917253341495722 5132230405022 5132230405023 0102030405023 010203040500 00 0Last Trains for Transfers from This Station.For MiyanosawaFor FukuzumiFor Shin sapporoTransfer at OdoriTransfer at SapporoTransfer at OdoriTransfer at Odori
[/code]

おおおお! テキストになった!!!

けど、これの解析はどうやろう。めんどくさい\(^o^)/
(ちなみにPDFリーダーで開いて、CTRL-Aでテキストを全選択してテキストをコピペしたほうが、もうちょっと読みやすいテキストで取得できます)

つづく。