見出し画像

【完結】PAD(Power Automate for Desktop)によるWebスクレイビングをやってみた ~第3回:Webから取得したテーブルの整理~

第2回の振り返り

第2回に引き続き、MS一覧表を作成していきたいと思います。
第2回では、MS情報をWebから取得してきました。
ただし、取得したデータが分析に向いていないため、第3回でデータの整理を行っていきます。
下記は前回と前々回の内容になりますので、前回何をやったかを確認したい方はこちらをどうぞ。


前回の課題

さて、前回の最後では、分析をするための表に変更していくことが課題としました。

第2回の課題

こちらの課題は、前回宣言した通り、Pythonでデータ整理をしていきます。


課題の分析

ひとまず、課題を分析するためにいくつか機体スペックを見てきました。

課題の分析:機体スペックの種類の確認

MSが変形とか変身とかシステムとかいろいろスキルを持っているので、機体スペックもいろいろな項目が存在しているのがわかります。

今回は、通常時のスペックを比較するための変形や変身の項目はそのまま生かします。
ただ、システムによる補正の値(項目名の中に入っている青い数字)は項目名を統一する観点から通常時とシステム中の値を分けて記載することが必要となります。


課題の対応方法

下記のような処理を行うことでほしいデータを生成することができます。

課題の対応方法
#!/usr/bin/env python
# coding: utf-8

import copy 
import pandas as pd
import re
import sys

def csvDataCleansing(input_path, output_path):

    # 入力CSVを読み込み
    with open(input_path, encoding='cp932') as f:
        csv_data = f.readlines()
    
    # 空要素を追加
    temp = []
    ms_data = []

    # 改行と**でデータを分割
    for line in csv_data:
      
        if line[0:3] == "\ufeff**" or line[0:2]=="**":
            if temp != []:
                ms_data.append(temp) 
            temp = []
            continue
        line = line.replace("\n","")
        temp.append(line)

    # 空のデータフレームを作成
    df_empty = pd.DataFrame(columns=[])

    for j in range(len(ms_data)):
        data = [row.split(",") for row in ms_data[j]]
        for i in range(len(data[0])):
            kitai = data[0][i]
            lv = data[1][i]

            if kitai == "機体名":
                string = kitai
                lv = "機体レベル"
            else:
                string = kitai + lv

            data[0][i] = string
            data[1][i] = lv

        columns = data[0]

        data_2 = []

        for string in data:
            string[0] = string[0].replace("<通常時>","")
            content = string[0]
        
            #システム単純数値用
            result = re.match(u'.*\([+,-]\d+\)$' , content)
        
            #システム単純数値用
            if result == None:
                result = re.match(u'.*\(消費?[+,-]*\d+.*\)$' , content)
            #システム単純数値用
            if result == None:
                result = re.match(u'.*\([+,-]*\d+.*\)$' , content)
                
            if result:
                string_sys = copy.deepcopy(string) 
                string[0] = re.sub(u"\(.+?\)", "", content)
                string_sys[0] = string[0] + "(システム)"
                sys_value = re.findall(u"\(.+?\)", content)
                for i in range(len(string)-1):
                    if string_sys[i+1] != "":
                        string_sys[i+1] = (string[i+1] + "+" + sys_value[0])
                data_2.append(string)
                data_2.append(string_sys)
                continue
                
            data_2.append(string)

        data_2 = [[item.strip() for item in row] for row in data_2]

        # Pandasのデータフレームを作成
        df = pd.DataFrame(data_2)
        
        # データフレームを転置して、最初の列をカラム名にする
        df_T = df.set_index(df.columns[0]).T.reset_index()
        df_T = df_T.set_index('機体名')
        
        # 最初のデータフレームは空のデータフレームである
        if j == 0:
            df_result = pd.concat([df_empty, df_T], axis=0, ignore_index=False)
        else:
            df_result = pd.concat([df_result, df_T], axis=0, ignore_index=False)
            
    df_result = df_result[df_result['機体レベル'] != '']

    df_result.to_csv(output_path, encoding="cp932")

if __name__ == "__main__":
    
    input_path = sys.argv[1]
    output_path = sys.argv[2]

    print(input_path)
    print(output_path)

    csvDataCleansing(input_path, output_path)

前回からの変更点

前回の課題の解決および更新したフローは下記のようになります。

前回からの変更点

とりあえず保留する課題

いくつか課題は残っていますが、対応の仕方が難しいため保留としました。

保留する課題

まとめ

今回までで、MS一覧が作成できる仕組みができました。
これで、毎週機体が追加されたり、月末の機体調整あってもすぐに一覧表が更新できるようになりました。

今回は以上となります。
少しでも皆様のお役に立てると幸いです。



この記事が気に入ったらサポートをしてみませんか?