はじめに
ある公式リリースノートから
- 情報取得
- 抽出・加工
- 一覧形式でcsv出力
したかったので、Pythonで作成しました。ETLのようなイメージです。
URLを載せると万が一アクセス集中した場合に迷惑がかかるので、対象は伏せます。
スクレイピングする際は、アクセス数に注意
私もまずはブラウザで閲覧してHTMLをダウンロードしてから、ローカル内で試行錯誤しています
成果物
EtlReleasenote.py
import requests
import csv
from bs4 import BeautifulSoup
# please change this setting
VERSION_LIST=["xxx","yyy","zzz"]
HEADER = ['version','Type','description']
# Webページを取得して解析する
for VERSION in VERSION_LIST:
load_url = f"https://${URL}/xxx/{VERSION}.html"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
with open('ReleaseNoteLists.csv', 'a', encoding='utf-8') as f:
writer = csv.writer(f, lineterminator="\n")
writer.writerow(HEADER)
for elements in soup.find_all(class_="${className}"):
for element in elements.find_all("li",recursive="False"):
h3 = elements.find('h3')
row = [VERSION,h3.text,element.text]
writer.writerow(row)
解説・ポイント
HTMLの欲しい要素のみ抽出
find
,find_all
を利用して、欲しいHTMLの要素を抽出している
for elements in soup.find_all(class_="${className}"):
for element in elements.find_all("li",recursive="False"):
h3 = elements.find('h3')
(漫画でスクレイピング分かりやすい)
文字列中に変数を代入(f-strings
)
f-strings
を利用すると、以下のように変数に代入する文字列に変数を利用できる。
load_url = f"https://${URL}/xxx/{VERSION}.html"
csv出力
Header付csv出力は以下あたりで実装している
import csv
HEADER = ['version','Type','description']
with open('ReleaseNoteLists.csv', 'a', encoding='utf-8') as f:
writer = csv.writer(f, lineterminator="\n")
writer.writerow(HEADER)
writer.writerow(row)
csv出力結果の空行詰める
csvの出力結果に空行が入ってしまったので、以下のように記述
writer = csv.writer(f, lineterminator="\n")
参考記事
2重ループうまくいかなかった時に助かりました
おわりに
最後まで見てくれてありがとうございます。
よかったらチャンネル登録(フォロー)と高評価(いいね)お願いします
週一で投稿目指してます。もしフォローかいいねをしてくれたら、やる気出るので、次週は投稿することを約束します。