みっか(3KA)ろぐ(仮)

音ゲーとゲームセンターの話をメインにした雑記録帳。

保存したbeatmaniaIIDXの楽曲データからスクレイピングでExcelファイルを作る【Python】

さて以前の記事(約11か月前)からの続き内容となっています。
kikyou9drt.hatenablog.com
今回はローカルに保存されたまま放置されていたHTMLをどう料理するか考えていきたいと思います。
PythonPythonからExcelを操作できるライブラリ、openPyxlを使用して、楽曲データをExcel化できないかと考えました。

やること

1.HTMLファイルを読み込む。

beautifulSoupを使用してHTMLファイルを読み込みます。
この時、保存形式が.mhtmlだった場合は以下の記事を参考にデコード処理します。
kikyou9drt.hatenablog.com

2.タグ構造を解析しリストに追加

f:id:kikyou_kiki:20201126224648p:plain
tbody以下が楽曲データのテーブルとなっているようです。
f:id:kikyou_kiki:20201126224755p:plain
3つ目のtr以下に楽曲データが入っています。
曲名、難易度種別、スコアは(とりあえず)そのまま持っていき、
DJ LEVELとクリアランプは画像へのリンクとなっているので加工します。

# クリアレベル
clearlevel = data[2].find('img')['src'].split("/")
record.append(clearlevel[-1].rstrip('.gif'))

直接取得するとクリアレベル画像のURLが取得できるので、
そこからファイル名のみを取得し、拡張子の.gifをカット。

# クリアランプ
clearFlag = data[4].find('img')['src'].split("/")
if clearFlag[-1] == 'clflg1.gif':
    record.append('failed')
elif clearFlag[-1] == 'clflg2.gif':
    record.append('A-Clear')
elif clearFlag[-1] == 'clflg3.gif':
    record.append('E-Clear')
elif clearFlag[-1] == 'clflg4.gif':
     record.append('Clear')
elif clearFlag[-1] == 'clflg5.gif':
    record.append('H-Clear')
elif clearFlag[-1] == 'clflg6.gif':
    record.append('EXH-Clear')
elif clearFlag[-1] == 'clflg7.gif':
    record.append('FullCombo')

上記と同じくファイル名のみを取得し、ファイル名からクリアランプ種別を分岐。

3.Excel

OpenPyxlで配列の内容を保存します。

(適当に書いた)ソースコード全貌

# coding: utf-8
from bs4 import BeautifulSoup
#import quopri    #デコードがいる場合
import openpyxl

def main():
    # ファイルの場所を指定
    html = ('')
    
    soup = BeautifulSoup(open(html), 'lxml', from_encoding='Shift_JIS')
    soup.prettify('Shift_JIS')
    
    # <tr>~</tr>を取得
    table = soup.find_all('tbody')[1]
    tr = table.find_all('tr')
    
    outdata = []
    for Row in tr:
        data = Row.find_all('td')
        record = []
        if (len(data)> 2):
            # 曲名
            #musicname = quopri.decodestring(data[0].text)    #デコードがいる場合このように処理
            musicname = data[0].text
            record.append(musicname)
            # 難易度種別
            difficult = data[1].text
            record.append(difficult)
            # クリアレベル
            clearlevel = data[2].find('img')['src'].split("/")
            record.append(clearlevel[-1].rstrip('.gif'))
            # スコア
            score = data[3].text
            record.append(score)
            # クリアランプ
            clearFlag = data[4].find('img')['src'].split("/")
            if clearFlag[-1] == 'clflg1.gif':
                record.append('failed')
            elif clearFlag[-1] == 'clflg2.gif':
                record.append('A-Clear')
            elif clearFlag[-1] == 'clflg3.gif':
                record.append('E-Clear')
            elif clearFlag[-1] == 'clflg4.gif':
                record.append('Clear')
            elif clearFlag[-1] == 'clflg5.gif':
                record.append('H-Clear')
            elif clearFlag[-1] == 'clflg6.gif':
                record.append('EXH-Clear')
            elif clearFlag[-1] == 'clflg7.gif':
                record.append('FullCombo')

            outdata.append(record)
    #print(outdata)    #出力確認

    #Excelシート化
    wb = openpyxl.Workbook()
    ws = wb.active

    for row in outdata:
        ws.append(row)

    #ファイルの保存場所指定
    wb.save('')

if __name__ == "__main__":
    main()

実行結果

コンソール

f:id:kikyou_kiki:20201126230020p:plain