はじめに
四月と言ったら「君の嘘」。nikkieです。
気づけば桜🌸が咲き(そして散り)、アニメファンとしてはウキウキの新クールです。
クールの頭には、アニメイトタイムズさんの一覧でざっと眺め、「0話切り」をしています。
今回も眺めていたところ、「パースして手元で見て、放送開始日順に並び替えられるのでは?」と思い付き、Pythonでやってみました1。
アニメイトタイムズさんの春アニメ一覧。構造は単調そうなのでHTMLで保存してBeautifulSoupでパースhttps://t.co/uTI3OHrkhm
— nikkie 📣PyCon JP 2021 スタッフ募集中! (@ftnext) 2021年4月3日
手元でざっと見た印象、今期も豊作ですね。
「さよなら私のクラマー」「不滅のあなたへ」と気になってた漫画タイトルのアニメ化!
フルバファイナルやメイドラゴン再放送も
目次
動作環境
HTMLのパースには以下を使います:
beautifulsoup4 4.9.3
なお、対象のHTMLはブラウザの機能でダウンロードして、パースの実装を試行錯誤しています。
試行錯誤の際にサーバに不要なリクエストが飛ぶのは望まないので、ローカルにダウンロードしました。
Pythonで0話切り
対象のHTML
開発者ツールで覗くと、section
タグとaside
タグによる2カラム構成です。
section
タグの中には、大まかには以下の構造でアニメの情報が詰まっています(今回興味あるところだけ抜き出しました)。
<h2 id="1">アニメ1</h2> <table> <tr> <td>放送<br>スケジュール</td> <th>2021年4月X日</th> </tr> <tr> ... </tr> </table> ... <h2 id="2">アニメ2</h2> <table> <tr> <td>放送<br>スケジュール</td> <th>2021年4月Y日</th> </tr> <tr> ... </tr> </table> ...
パース戦略
h2
タグとtable
タグがセットになって、春クールのアニメ分並んでいます。
h2
タグはアニメのタイトル以外にも使われているのですが、アニメのタイトルで使う場合id
属性が指定されているという特徴がありました2。
この作りを利用して、section
タグの中身から以下を抜き出しました:
id
属性が指定されたh2
タグtable
タグ
これらの数が一致することを確認しました!
あとは、table
タグの中の「放送スケジュール」の行の日付をdatetime.date
に変換して、放送開始日順に並び替えます。
スクリプトはこちら:
取り組んで知った技術的なトピック
beautifulsoup4でHTMLタグのid属性を扱う
soup.find_all("タグ")
で見つかった1個1個のタグ(Tag
)について、タグの属性(attribute)3を扱えました!
h2
タグについて
re
のfindall
とfinditer
の違い
matches = re.finditer(r"(\d{4})年(\d{1,2})月(\d{1,2})日", schedule) for m in matches: ...
正規表現を使い、放送日を表す文字列 schedule
から finditer
で全てのマッチオブジェクトを取り出します6。
今クールに再放送するために、本放送日と合わせて複数の日付が載っているケースがありました(例:ニジガク)。
https://docs.python.org/ja/3/library/re.html#finding-all-adverbs-and-their-positions
パターンの全てのマッチについて、マッチしたテキスト以上の情報が必要なら、文字列ではなく マッチオブジェクト を返す finditer() が便利です。
個々のマッチオブジェクト m
は
m.group(0)
が正規表現にマッチした文字列全体m.group(1)
,m.group(2)
, ...がキャプチャの()
に対応
します7。
感想
手元でタイトル眺め、気になるものは詳細を確認して、今期の0話切りは終了です。
気になってた漫画タイトルのアニメ化が多く、楽しみです🤩
今クールは全部で80作品ほどあり、「こんなにあるのか」と驚きました。
続き物や深夜帯でない枠は含んでいないので、1クール100本くらいのアニメが流れているんですね!
-
目次からページ内を移動できるようにするためだと思われます↩
-
https://developer.mozilla.org/ja/docs/Learn/HTML/Introduction_to_HTML/Getting_started#attributes↩
-
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function↩
-
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#multi-valued-attributes↩
-
findall
は文字列だけです。ref: https://docs.python.org/ja/3/library/re.html#finding-all-adverbs↩ -
https://docs.python.org/ja/3/library/re.html#re.Match.group↩