シクロの家の空き室状況がわかりにくかったのでCSVに変換
import calendar import datetime import re import pandas as pd import requests from bs4 import BeautifulSoup # スクレイピング def scraping(): url = "http://www.cyclonoie.com/availability.php" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" } r = requests.get(url, headers=headers) r.raise_for_status() soup = BeautifulSoup(r.content, "html5lib") result = [] for i in soup.find("div", class_="alpha-web", style="text-align: center;").select( "p.alpha-web-text01" ): text = i.get_text(strip=True) pattern = r"\d{1,2}月\d{1,2}日" matchOB = re.match(pattern, text) if matchOB: t = [j.strip() for j in re.split("(ミックスドミトリー|女性ドミトリー|2人用個室|4人用個室)", text)] result.append(t) return result # 月日から年月日に変換(うるう年用) def dt_conv(s): today = datetime.date.today() try: dt = datetime.datetime.strptime(s, "%m月%d日") dt = dt.replace(year=today.year).date() except: year = today.year while not calendar.isleap(year): year += 1 m = re.match(r"(\d{1,2})月(\d{1,2})日", s) month, day = map(int, m.groups()) dt = datetime.date(year, month, day) return dt if __name__ == "__main__": # スクレイピング result = scraping() # DataFrameに変換 df = pd.DataFrame(result) # 日付とイベント分離 df1 = df[0].str.extract(r"(\d{1,2}月\d{1,2}日)(.)(イベントのため(休館|貸切))?") df1.rename(columns={0: "日付", 1: "イベント", 2: "状況"}, inplace=True) # 結合 df2 = pd.concat([df, df1], axis=1) # 部屋名除去 df3 = df2.drop(df2.columns[[0, 1, 3, 5, 7, 10]], axis=1) # 月日から年月日に変換 df3["日付"] = df3["日付"].apply(dt_conv) # 日付をインデックスに設定 df3.set_index("日付", inplace=True) # 列名変更 df3.rename( columns={2: "ミックスドミトリー", 4: "女性ドミトリー", 6: "2人用個室", 8: "4人用個室"}, inplace=True ) # 残り数を数字のみに変更 df3.replace(r"\s", "", regex=True, inplace=True) df3.replace("○Last", "", regex=True, inplace=True) # CSVに書き出し df3.to_csv("result.csv", encoding="utf_8_sig")