Pythonista の学習として、Webページを読み込んで加工するプログラムを書いてみました。
盛岡バスロケーションシステム
盛岡市内を運行しているバスの時刻表を検索することができる、盛岡市バスロケーションシステム、バス運行情報のページ( http://gps.iwatebus.or.jp/pc/index.htm ) では、乗降するバス停の名前がわかれば時刻表を検索することができる便利なWebサービスです。
が、iPhone の Safari で表示すると、バス停の検索・指定が面倒だったり、表示される文字が小さかったりと意外と不便でした。(個人的な感想)
対策としては良く使うバス停のコードを調べてAPIを使ってデータを取込・加工して表示するのを Workflow アプリを作って使用していました。
それを Pythonista でやってみようと思い立った。
取り敢えず動作するプログラム
習作として、バス停コードを指定してAPIから取得した Webデータを加工して表示するプログラムを作りました。
(バス停のコードは乗車するバス停を選択するページのソースから調べることができます。加工してCSVにしましたが、公開は控えます)
ソースは Pythonista 2.7系でのみ動作します。
新しい Pythonista 3 では、urllib2 が import できなくて動きませんでした。
(追記:コメントで頂いた情報で動くようになったので、下にソースを追加しました。)
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib2
import re
import codecs
ps = re.compile(r'<.*?>')
pnbsp = re.compile(r' ')
prt = re.compile(r'^\n')
URL1 = 'http://gps.iwatebus.or.jp/bls/pc/jikoku_jk.jsp?'
ride = "jjg=1&jtr=241" # 盛岡駅前のコード
goff = "kjg=1&ktr=383". # 盛岡八幡宮前のコード
getURL = URL1 + ride + '&' + goff
r = urllib2.urlopen(getURL)
webdata.decode('sjis')
wdata = ps.sub('',webdata)
wdata = pnbsp.sub('',wdata)
wdata = prt.sub('',wdata)
wdata.replace(" ","")
wdata.replace(";","\r")
alldata = wdata.split("\r")
od = ""
hr = ""
for ld in alldata:
ld.decode('sjis')
wd = ld.lstrip()
if (len(wd) >1): # 1文字だけの行は処理しない
if wd == '<!--' or wd == '-->': # 複数行のコメントタグが残っているので、無視
pass
elif (len(wd) == 2): # 2文字の行は時刻の可能性が高い
if not wd == ';;': # セミコロン2個の行でなければ時刻のデータ
hr = '[' + wd + ']:' # 時刻のデータを保管
elif wd[0] == ";": # セミコロンで始まる行は「分」のデータ
od = od + hr + wd.replace(";",'') + "\r" # 時刻データと分のでーたを連結
else:
od = od + wd.replace(";",'') + "\r" # 上記以外のデータをセミコロンを消して連結
alldata = od.split("\r") # 改行を区切りにして配列(リスト)にする
od = ""
for ld in alldata:
if (len(ld) > 0):
if ld[0:5] == '[24]:': # 24時の後ろに「分」データが無いと、「土曜日」、「休日」がくっついているので分割する
if ld[7] in '0123456789': # 24時の後ろが数値なら分データとして扱う
od = od + ld + "\r\n"
else:
od = od + ld[5:len(ld)] + "\r\n" # 分データ無しなので24時は削除
elif ('[;' in ld): # 処理の過程で出るゴミの行を無視
pass
elif ('[' in ld) and len(ld) == 6: # 処理の過程で出るゴミの行を無視
pass
else:
od = od + ld + "\r\n"
print od.decode('sjis') # 処理結果をShift-JISに変換して標準出力に書き出す
追記: Pythonista3 の中には 2.x系のライブラリーも含まれていたので、後で切替方法を探そうと思っていたところ、コメントで Pythonista3 で python 2.x系を動かす方法を教えていただきました。
また、ソースを見なおしてリファクタリングとコメント追加をしていましたので、Pythonista3 で動作するソースを追記しておきます。
#!python2
# -*- coding: utf-8 -*-
import urllib2
import re
import codecs
URL1 = 'http://gps.iwatebus.or.jp/bls/pc/jikoku_jk.jsp?'
ride = "jjg=1&jtr=241" #-- 盛岡駅のバス停コード
goff = "kjg=1&ktr=383" #-- 八幡宮前のバス停コード
getURL = URL1 + ride + '&' + goff
r = urllib2.urlopen(getURL)
webdata = r.read() # Webデータの読み込み
webdata.decode('sjis') # データが Shift-jis なのでデコードする
wdata = re.sub(r'<.*?>', '',webdata) # HTMLタグを消す
wdata = re.sub(r' ','', wdata) #   を消す(セミコロンは敢えて残す)
wdata.replace(' ','') # 空白を消す
wdata.replace(';','\r') # セミコロンを改行に変換
alldata = wdata.split('\r') # 改行を区切りにして配列(リスト)にする
od = ""
hr = ""
for ld in alldata:
ld.decode('sjis')
wd = ld.lstrip()
if (len(wd) >1): # 1文字だけの行は処理しない
if wd == '<!--' or wd == '-->': # 複数行のコメントタグが残っているので、無視
pass
elif (len(wd) == 2): # 2文字の行は時刻の可能性が高い
if not wd == ';;': # セミコロン2個の行でなければ時刻のデータ
hr = '[' + wd + ']:' # 時刻のデータを保管
elif wd[0] == ";": # セミコロンで始まる行は「分」のデータ
od = od + hr + wd.replace(";",'') + "\r" # 時刻データと分のでーたを連結
else:
od = od + wd.replace(";",'') + "\r" # 上記以外のデータをセミコロンを消して連結
alldata = od.split("\r") # 改行を区切りにして配列(リスト)にする
od = ""
for ld in alldata:
if (len(ld) > 0):
if ld[0:5] == '[24]:': # 24時の後ろに「分」データが無いと、「土曜日」、「休日」がくっついているので分割する
if ld[7] in '0123456789': # 24時の後ろが数値なら分データとして扱う
od = od + ld + "\r\n"
else:
od = od + ld[5:len(ld)] + "\r\n" # 分データ無しなので24時は削除
elif ('[;' in ld): # 処理の過程で出るゴミの行を無視
pass
elif ('[' in ld) and len(ld) == 6: # 処理の過程で出るゴミの行を無視
pass
else:
od = od + ld + "\r\n"
print od.decode('sjis') # 処理結果をShift-JISに変換して標準出力に書き出す