はじめに
自動車の教習所では技能(実際の運転)と学科(座学)を勉強する必要があります.技能は担当教官と日程を調整して進めていくことが多いですが,学科は決められた時間割から都合の良い時間の講義を取っていくことが多いかなと思います.以下が私が通っている千歳自動車学校の学科時間割の一部です.第一段階の学科は黒文字で,第二段階の学科は赤文字で表記されています.
第一段階の学科を連続して受けられる箇所を赤丸で囲いました.どうせ教習所に足を運ぶなら,こういう連続して受けられる日程を狙って行きたいですよね?別に目視で確認すればすむことではあるのですが,私が通っている教習所の時間割が2行で一つの時間帯を表していて若干見づらいのと,個人的に色弱気味で赤と黒の判別が大変です.そこで 千歳自動車学校の学科を連続して受けられる日程を出力するCLIスクリプト を書きました.ニッチ過ぎるアプリですが GitHub Gist で公開しているので,ライブラリをインストールすれば誰でも使えます.千歳自動車学校に通われている方はご活用ください(いるのか?).
最終的な出力
$ python find_continue_blacks.py
20(金) 16:00~17:00 5 10
21(土) 11:00~12:00 1 2
29(日) 11:00~12:00 1 5
31(火) 12:00~13:00 1 9
20日辺りがねらい目ですね。
用いたライブラリ
- bs4
- click
- requests-html
工夫した点
-
表を List of List の行列形式にパース
- 必要なのは表の情報だけなので,行列形式で格納し直します.後々 for 文とかを回しやすくするためです.
def get_time_table_matrix(): html = scrape_latest_timetable() # requests_html.HTML mat = [] soup = BeautifulSoup(html.html, 'html.parser') # tableの取得 table = soup.find('table') # tbodyの解析 tbody = table.find('tbody') trs = tbody.find_all("tr") for tr in trs: r = [] # 各行を保存 th_tds = tr.find_all(["th", "td"]) for th_td in th_tds: r.append(th_td) mat.append(r) # 行をテーブルに保存 return mat
-
列単位で処理するためにリストを転置
- 連続して受けられる時間を見るためにはテーブルを上から下に走査する必要があります.組み込みリストを転置するのが若干複雑です.
mat_T = list(map(list, zip(*mat)))
感想
今回みたいなノリで個人的な課題に対して,さくっとプログラムを書けると楽しいですよね.色弱の人を支援するアプリとか作れないかな…