前提・実現したいこと
pythonでスクレイピングを行いたい
具体的には、[このページ]の任意の店舗をクリックした先にある表を
日別で、予約ボックス内の時間・レッスン・インストラクターのテキストを配列化したい
(ゆくゆくはDB化したい)
出来上がりのイメージは以下の通り(六本木をクリックした前提)
日付, 時間, レッスン, インストラクター 予約フラグ
1 7/21(土), 10:0010:45, BSW Regg 1, Rui, 111:45, BB1 Hit 11, Rui, 1
2 7/21(土), 11:00
3 7/21(土), 12:00~12:45, BB2 MJ 1, Hiroto, 0
...
予約フラグについては、予約のオブジェクトのclass属性値が'unit_reserved'の場合に1としたい
試したこと
seleniumでブラウザを操作し、Beautifulsoupでテキストを取得
当初seleniumのみでテキストの抽出を行うと思いましたが、前述のclass値に応じたフラグ判定を行いたいと思い、beautifulsoupを使いました。
(その判断があっているのかわかりません。)
実現したいもののうち、日付と予約フラグを除いて配列化できました。
該当のソースコード
Python
1from selenium import webdriver 2from selenium.webdriver.support import expected_conditions as EC 3from selenium.webdriver.support.ui import Select 4from bs4 import BeautifulSoup 5import pandas as pd 6 7driver = webdriver.Chrome('C:\driver\chromedriver.exe') 8 9driver.get("https://www.feelcycle.com/feelcycle_reserve/reserve.php")#店舗ページを開く 10driver.find_element_by_xpath('//*[@id="schedule"]/form/div/li[1]/a/img').click()#六本木を選択 11 12 13r = driver.page_source.encode('utf-8') 14html = BeautifulSoup(r, 'lxml') 15elems = html.find_all('div', class_=['unit','unit_past','unit_reserved']) 16 17lesson_data = []#空のリストを作成 18 19for elem in elems: 20 text=elem.get_text() 21 text = text.split('\n')#改行(\n)で分割する 22 lesson_data.append(text)#分割したデータをリストに挿入 23 24df = pd.DataFrame(lesson_data) 25print(df) 26
発生している問題・エラーメッセージ
が、以下2点をどう実現したらいいかわからず、手詰まり状態です。
・日付の取得
一つ上の階層(?)のdivタグにある日付を各レコードに持たせたい(HTMLの知識が非常に乏しく表現できずすみません。)
・予約フラグの判定
class属性値がunit_reservedの場合1 としたい
予約オブジェクトのclass属性値を確認すると、
unit(選択可能枠),unit_past(選択不可枠),unit_reserved(予約済枠)の3つがあることが確認できました。
しかしながら、各エレメントのclass値の判定や、取得について、classを指定した抽出に関する記事は出てくるのですが、
各エレメントのclassを判定するなどの方法が出てこず手詰まり状態です。
何卒よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
・python 3.6.5
・beautifulsoup 4.6.0
・selenium 3.13.0
回答1件
あなたの回答
tips
プレビュー