LoginSignup
12
13

More than 5 years have passed since last update.

Pythonista で盛岡バスロケーションシステムの時刻表を表示する

Last updated at Posted at 2016-06-26

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 できなくて動きませんでした。
(追記:コメントで頂いた情報で動くようになったので、下にソースを追加しました。)

bistable.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib2
import re
import codecs

ps = re.compile(r'<.*?>')
pnbsp = re.compile(r'&nbsp')
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 で動作するソースを追記しておきます。

busTimeTable3.py
#!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'&nbsp','', wdata)  # &nbsp を消す(セミコロンは敢えて残す)
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に変換して標準出力に書き出す

12
13
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13