nikkie-ftnextの日記

イベントレポートや読書メモを発信

Pythonで備える2021春アニメ

f:id:nikkie-ftnext:20210407214953p:plain

はじめに

四月と言ったら「君の嘘」。nikkieです。
気づけば桜🌸が咲き(そして散り)、アニメファンとしてはウキウキの新クールです。

クールの頭には、アニメイトタイムズさんの一覧でざっと眺め、「0話切り」をしています。
今回も眺めていたところ、「パースして手元で見て、放送開始日順に並び替えられるのでは?」と思い付き、Pythonでやってみました1

目次

動作環境

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タグについて

  • id属性を持つか判定:has_attr("id")4
  • id属性の値:get_attribute_list("id")5リストで返ります)

refindallfinditerの違い

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本くらいのアニメが流れているんですね!