質問: { 'element': [ value.find_all('td')[1].text, value.find_all('td')[9].text, value.find_all('td')[17].text, ], 'value': [ value.find_all('td')[2].text, value.find_all('td')[10].text, value.find_all('td')[18].text, ], 'remark': [ value.find_all('td')[7].text, value.find_all('td')[15].text, value.find_all('td')[23].text, ] } ```
回答: おそらくC言語とかからプログラムを勉強し始めたのかと思いますが、 pythonではC言語などでやっていたindexを使ったforの回し方とニュアンスが違ってくるので 慣れるまではしっくりこないと思います しかし慣れてしまえば下記のように非常に理解がしやすい?記述が可能になりますので ぜひとも慣れてしまうことをお勧めします 自分もC言語から始めたので大変でした(**) パパっと適当に書いたので間違ってるかもしれませんがこれでおそらくニュアンスがつかめるのではないでしょうか 詳しくはpythonの公式サイトや本を参考にすることをお勧めします ``` for index, value in enumerate(all_tables): row_number = len(value.tbody.find_all('tr')) for i in range(0, 8*row_number, 8): processed_tables[index]['element'].append(value.find_all('td')[1+i].text) processed_tables[index]['value'].append(value.find_all('td')[2+i].text) processed_tables[index]['remark'].append(value.find_all('td')[7+i].text) ``` 追記 ``` #指定数の配列を用意して0で初期化 processed_tables = [ 0 for i in range(number) ] ``` ここのコードを読み飛ばしておりここがエラーになっていました processed_tableに入ってるのは数字のリストなのに 数字に添え字で['element']ってやってもアクセスできないよねってことでした pythonではリストを宣言する際にサイズを気にする必要はありません 初期化してそこに要素をappendすれば勝手に要素数を増やしていってくれます 多分これでエラーを回避できると思います(最初のやつよりだいぶ変わっちゃいました) ``` #取得するtable数 number = int(input()) #入力された数だけtableタグを取得する all_tables = soup.find_all('table', limit = number) # init List processed_table = [] for value in all_tables: row_number = len(value.tbody.find_all('tr')) dir_dict = {'element':[], 'value':[], 'remark':[]} for i in range(0, 8*row_number, 8): dir_dict['element'].append(value.find_all('td')[1+i].text) dir_dict['value'].append(value.find_all('td')[2+i].text) dir_dict['remark'].append(value.find_all('td')[7+i].text) processed_table.append(dir_dict) ``` おそらくこれで実行できて、 processed_tableにはdir_dictのリストが入っていて processed_table[all_tableの数]でアクセスできる processed_table[all_tebleの数]にはdir_dictが入っていて processed_table[all_tableの数]['element']などでアクセスできる processed_table[all_tableの数]['element']にはリストが入っていて processed_table[all_tableの数]['element'][row_number]でアクセスできる processed_table[all_tableの数]['element'][row_number]には value.find_all('td')[2+i].textなどが入っていて そこから先はbeautifulsoupにお任せします ただdictの中にあんまりlistを入れたくないので、 自分であれば processed_table[all_tableの数]['element'][row_number]の並びよりも processed_table[all_tableの数][row_number]['element']の並びにすると思います なかなか分からない事だらけだと思いますが頑張ってください(^o^)/