前提
Pythonの初心者で勉強中であるため質問の仕方がおかしかったら申し訳ございません。
本を見ながら試してみたのですが、エラーが出てこれ以上進めることができない状態です。
実現したいこと
Web上にある次のようなテーブルから「年月」「売上」「客数」を取得し、最終的にCSVにしたいと考えています。
年月 | 売上 | 単価 | 客数 |
---|---|---|---|
2022年1月 | 520,000 | 5,200 | 100 |
2022年2月 | 600,000 | 5,000 | 120 |
2022年3月 | 663,000 | 5,100 | 130 |
2022年4月 | 504,000 | 6,300 | 80 |
2022年5月 | 638,000 | 5,800 | 110 |
HTML
1<thead> 2 <tr> 3 <th class="syukei">年月</th> 4 <th class="syukei">売上</th> 5 <th class="syukei">客数</th> 6 </tr> 7</thead> 8<tbody> 9 <tr> 10 <th class="year">2022年1月</th> 11 <td>520,000</td> 12 <td>5,200</td> 13 <td>100</td> 14 </tr> 15 <tr> 16 <th class="year">2022年2月</th> 17 <td>600,000円</td> 18 <td>5,000</td> 19 <td>9,350</td> 20 <td>120</td> 21 </tr> 22</tbody>
完成イメージ
分からないこと
①"年月"の列が<th>で、取得の仕方が分かりません。
②とりあえず<td>の値だけ取得しようとしたら下部に記載のエラーが出ます。
試したこと
Python
1#空リストの作成 2vals1 = []#売上 3vals2 = []#客数 4 5#テーブルのボディ部分を選択する 6table = driver.find_element_by_tag_name('tbody') 7#ボディ部分からtrタグをすべて取得 8elems = table.find_elements_by_tag_name('tr') 9 10#trタグの数だけループしtdの値を取得 11for elem in elems: 12 val1 = elem.find_elements_by_tag_name('td')[0].text 13 val2 = elem.find_elements_by_tag_name('td')[2].text 14 15#取得した値をvalsリストに順番に追加 16 vals1.append(vals1) 17 vals2.append(vals2) 18 19#CSV作成 20import pandas as pd 21df=pd.DataFrame({'売上':vals1,'客数':vals1}) 22df.to_csv("集計.csv",encoding="shift_jis")
発生している問題・エラーメッセージ
IndexError: list index out of range
インデックスが範囲外とのことですが、('td')[0]を[1]や[2]に変えたところでは変わらないです。
該当のソースコード
val1 = elem.find_elements_by_tag_name('td')[0].text
補足(取得したい情報)
これが実際に取得したい対象のテーブルになります。
テーブルの左端から「年月」~「再来」の数字を1年分取得したいと思っています。
[0]でout of rangeなので、"td"の要素が1つもないようです。
本当にtdタグが入ったhtmlが取れているかどうか、確かめたほうが良いでしょう。
提示してもらったコードの一番上のタイミングで
print(driver.page_source)
を実行してhtmlを表示するとどうなりますか?
コメントありがとうございます!
一番上にprint(driver.page_source)を入れて実行すると膨大な量のソースが出てきました。
細かく見ていったところ、取得したいtable、tdもありましたが、他にも色んなtableが存在していました。
もしかして、何のtableから取得したいのかが明確になっていないということでしょうか?
※この時間しか勉強ができず、せっかくコメントいただいたのに遅くなり申し訳ございません。
質問欄の最後に補足として実際のテーブルとそのソースの画像を載せました。
はい、tableを絞り込む必要がありそうです。
回答2件
あなたの回答
tips
プレビュー