Python

データを確保しよう②

前回、日刊スポーツのサイトから優勝チームの一覧を引っこ抜いてみました。

データを確保しよう日刊スポーツ様のサイトから歴代セ・リーグの歴代優勝チームを抜き出します。...

しかし、最終的に不満が残りましたので、改善していきたいと思います。

不満

出力結果に不要な情報(tdタグの表示)が含まれているなど、データ分析がしにくいデータとなってしまったことです。

改善方法

不要な情報を削除する。

前回はHTMLの入れ子構造の上位にあるtrタグを抽出して処理したため、trタグの入れ子内部に存在するthタグやtdタグの表示が取得したデータに残ってしまいました。

そこで、今回は入れ子構造を理解した上で、より取得したいデータの近傍にあるthタグ、tdタグを読み込んで処理するように改善します。

Pandasを利用する。

前回はcsvファイルに書き出すことを目標にしていましたが、後々データフレーム形式にしてPandasに読み込ませることに気付きました。今回は最初からPandasのデータフレーム形式にすることにしました。

 

改善したコード

今回作成したコードは以下の通りです。

# 実行環境はWindows11、anaconda3、JupyterNotebook。

# 必要なライブラリを読み込み
from bs4 import BeautifulSoup
import requests
import csv
import pandas as pd
import re

# 指定したURLからデータを取得
res = requests.get("https://www.nikkansports.com/baseball/professional/record/victory/pf-victory_cl.html")

# 取得したデータをsoup変数に代入
soup = BeautifulSoup(res.text,"html.parser")

# 取得したデータから目的の「表」を検索
table = soup.find("table",class_="nsTable")

# 表中の行を検索
rows = table.find_all("tr")

# 表のヘッダ行を探して、データフレームの列名とする。
columns = [v.text for v in rows[0].find_all("th")]
df = pd.DataFrame(columns=columns)

# ヘッダ行以外の行からデータを取り出して、データフレームに追加していく。
for i in range(len(rows)):
  tds = rows[i].find_all("td")
  if len(tds) == len(columns):
    values = [td.text for td in tds]
    df = df.append(pd.Series(values, index=columns),ignore_index= True)

# 列「優勝チーム(監督)」から(~)部分を削除する。
df = df.rename(columns={"優勝チーム(監督)":"優勝チーム"})
df["優勝チーム"] = df["優勝チーム"].replace("(.*)","",regex=True)

# 作成したデータフレームを出力する。
print(df)

# 作成したデータフレームをcsvファイルとして出力する。
df.to_csv("championship.csv",encoding="shift-jis")
ここでは後々メモ帳に表示させるため、csvファイルのエンコードをSHIFT-JISにしています。

実行結果

今回取得したは以下の画像のとおりです。

前回と比較するとだいぶすっきりしたことが分かります。

前回の実行結果
今回の実行結果

まとめ

今回のコード改善により、よりデータ分析しやすいデータを取得することができました。

次回はデータが少なく実行できなかった分析を、今回取得したデータを用いて行っていきたいと思います。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA