質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1141閲覧

スクレイピングしたデータの加工の仕方

koukiten

総合スコア6

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/17 05:53

J-leagueのサイトのスクレイピイングをしています。
全チームの情報をcsvファイルにして保存したいと思っています。
データを抽出すると、以下のようにすべて一つずつの要素として出力されます。
これを一番下のような要素すべてで1チームの情報としたいのですが加工の仕方がわかりません。
スクレイピングは初心者なのでわかる方いらっしゃいましたら、ご教授お願いいたします。

import requests from bs4 import BeautifulSoup import pandas as pd import time import os url='https://data.j-league.or.jp/SFTD01/search?team_flag=0&competition_frames=1&competition_frames=2&competition_frames=3&competition_year_from=1993&competition_year_to=2020&HomeAwayId=0&competition_frames_name=%EF%BC%AA%EF%BC%91%E3%83%AA%E3%83%BC%E3%82%B0%2C%EF%BC%AA%EF%BC%92%E3%83%AA%E3%83%BC%E3%82%B0%2C%EF%BC%AA%EF%BC%93%E3%83%AA%E3%83%BC%E3%82%B0&competition_year_from_name=1993%E5%B9%B4&competition_year_to_name=2020%E5%B9%B4&teams_name=' r=requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding html=r.text soup=BeautifulSoup(html,'html.parser') data=soup.find(class_='table-base00 search-table') all_data=data.findAll('tr') info=[] team_info=[] #infoの情報を取得 data_1=all_data[0].find_all('th') #infoにデータを格納 for i in data_1: info.append(i.get_text()) for i in range(1,len(all_data)): data_2=all_data[i].find_all('td') for j in data_2: team_info.append(j.get_text()) data__columns=[info]
['札幌', 'J1', '79', '76', '3', '0', '43', '159', '140', '15', '4', '355', '524', 'J1', '', '札幌', 'J2', '257', '251', '6', '0', '150', '190', '188', '2', '0', '789', '644', 'J1', '', '八戸', 'J3', '18', '18', '0', '0', '9', '21', '21', '0', '0', '65', '64', 'J3', '', '岩手', 'J3', '56', '56', '0', '0', '51', '105', '105', '0', '0', '246', '330', 'J3', '', '仙台', 'J1', '135', '133', '2', '0', '104', '176', '171', '5', '0', '509', '591', 'J1', '', '仙台', 'J2', '185', '175', '10', '0', '87', '125', '114', '11', '0', '592', '479', 'J1', '', '秋田', 'J3', '90', '90', '0', '0', '48', '73', '73', '0', '0', '270', '228', 'J3', '', '山形', 'J1', '30', '30', '0', '0', '36', '70', '70', '0', '0', '108', '199', 'J2', '', '山形', 'J2', '278', '268', '10', '0', '202', '267', '256', '11', '0', '918', '878', 'J2', '', '福島', 'J3', '67', '67', '0', '0', '52', '93', '93', '0', '0', '246', '298', 'J3', '', '鹿島', 'J1', '517', '475', '33', '9', '134', '284', '255', '21', '8', '1613', '1113', 'J1', '', '水戸', 'J2', '259', '250', '9', '0', '230', '389', '380', '9', '0', '911', '1176', 'J2', '', '栃木', 'J2', '121', '121', '0', '0', '110', '165', '165', '0', '0', '416', '500', 'J2', '', '栃木', 'J3', '33', '33', '0', '0', '20', '9', '9', '0', '0', '82', '44', 'J2', '', '群馬', 'J2', '151', '151', '0', '0', '142', '285', '285', '0', '0', '571', '871', 'J2', '', '群馬', 'J3', '33', '33', '0', '0', '16', '17', '17', '0', '0', '96', '69', 'J2', '', '浦和', 'J1', '424', '388', '25', '11', '146', '334', '297', '31', '6', '1414', '1214', 'J1', '', '浦和', 'J2', '28', '23', '5', '0', '3', '9', '7', '2', '0', '82', '40', 'J1', '', '大宮', 'J1', '129', '129', '0', '0', '104', '175', '175', '0', '0', '455', '579', 'J2', '', '大宮', 'J2', '199', '187', '12', '0', '76', '122', '117', '5', '0', '557', '424', 'J2', '', '千葉', 'J1', '227', '195', '26', '6', '70', '281', '236', '37', '8', '874', '980', 'J2', '', '千葉', 'J2', '172', '172', '0', '0', '108', '149', '149', '0', '0', '602', '517', 'J2', '', '柏', 'J1', '331', '303', '24', '4', '126', '295', '272', '18', '5', '1153', '1095', 'J1', '', '柏', 'J2', '75', '75', '0', '0', '27', '24', '24', '0', '0', '240', '117', 'J1', '', 'FC東京', 'J1', '270', '262', '8', '0', '141', '233', '227', '6', '0', '897', '820', 'J1', '', 'FC東京', 'J2', '44', '42', '2', '0', '11', '19', '17', '2', '0', '118', '57', 'J1', '', '東京V', 'J1', '226', '189', '31', '6', '43', '207', '173', '24', '10', '767', '713', 'J2', '', '東京V', 'J2', '230', '230', '0', '0', '149', '197', '197', '0', '0', '780', '695', 'J2', '', '町田', 'J2', '73', '73', '0', '0', '74', '82', '82', '0', '0', '260', '287', 'J2', '', '町田', 'J3', '43', '43', '0', '0', '17', '9', '9', '0', '0', '111', '40', 'J2', '', '川崎F', 'J1', '280', '276', '4', '0', '117', '160', '160', '0', '0', '1011', '728', 'J1', '', '川崎F', 'J2', '126', '118', '8', '0', '33', '53', '48', '5', '0', '401', '232', 'J1', '', '横浜FM', 'J1', '457', '417', '30', '10', '163', '316', '285', '27', '4', '1456', '1135', 'J1', '', '横浜FC', 'J1', '9', '9', '0', '0', '6', '35', '35', '0', '0', '40', '99', 'J1', '', '横浜FC', 'J2', '269', '266', '3', '0', '210', '292', '289', '3', '0', '921', '1003', 'J1', '', 'YS横浜', 'J3', '47', '47', '0', '0', '50', '115', '115', '0', '0', '225', '363', 'J3', '', '横浜F', 'J1', '117', '92', '18', '7', '0', '111', '90', '17', '4', '375', '373', '', '', '湘南', 'J1', '145', '127', '13', '5', '50', '246', '227', '16', '3', '581', '806', 'J1', '', '湘南', 'J2', '253', '246', '7', '0', '143', '217', '208', '9', '0', '828', '745', 'J1', '', '相模原', 'J3', '75', '75', '0', '0', '52', '85', '85', '0', '0', '262', '306', 'J3', '', '甲府', 'J1', '69', '69', '0', '0', '73', '130', '130', '0', '0', '255', '404', 'J2', '', '甲府', 'J2', '217', '215', '2', '0', '140', '213', '204', '9', '0', '754', '755', 'J2', '', '松本', 'J1', '13', '13', '0', '0', '20', '35', '35', '0', '0', '51', '94', 'J2', '', '松本', 'J2', '126', '126', '0', '0', '75', '70', '70', '0', '0', '359', '270', 'J2', '', '長野', 'J3', '99', '99', '0', '0', '60', '53', '53', '0', '0', '270', '184', 'J3', '', '新潟', 'J1', '156', '156', '0', '0', '115', '201', '201', '0', '0', '557', '679', 'J2', '', '新潟', 'J2', '150', '138', '12', '0', '58', '103', '93', '10', '0', '482', '370', 'J2', '', '富山', 'J2', '59', '59', '0', '0', '60', '132', '132', '0', '0', '234', '374', 'J3', '', '富山', 'J3', '75', '75', '0', '0', '46', '57', '57', '0', '0', '231', '194', 'J3', '', '金沢', 'J2', '69', '69', '0', '0', '77', '83', '83', '0', '0', '271', '293', 'J2', '', '金沢', 'J3', '23', '23', '0', '0', '6', '4', '4', '0', '0', '56', '20', 'J2', '', '清水', 'J1', '399', '349', '42', '8', '139', '363', '333', '23', '7', '1307', '1321', 'J1', '', '清水', 'J2', '25', '25', '0', '0', '9', '8', '8', '0', '0', '85', '37', 'J1', '', '磐田', 'J1', '385', '344', '37', '4', '130', '299', '275', '19', '5', '1342', '1113', 'J2', '', '磐田', 'J2', '49', '49', '0', '0', '31', '23', '23', '0', '0', '168', '118', 'J2', '', '藤枝', 'J3', '80', '80', '0', '0', '42', '90', '90', '0', '0', '274', '302', 'J3', '', '沼津', 'J3', '45', '45', '0', '0', '29', '39', '39', '0', '0', '148', '121', 'J3', '', '名古屋', 'J1', '407', '372', '28', '7', '137', '355', '326', '23', '6', '1380', '1292', 'J1', '', '名古屋', 'J2', '23', '23', '0', '0', '6', '13', '13', '0', '0', '85', '65', 'J1', '', '岐阜', 'J2', '127', '127', '0', '0', '117', '259', '259', '0', '0', '509', '815', 'J3', '', '岐阜', 'J3', '7', '7', '0', '0', '4', '3', '3', '0', '0', '24', '15', 'J3', '', '京都', 'J1', '104', '89', '14', '1', '41', '207', '187', '18', '2', '398', '640', 'J2', '', '京都', 'J2', '258', '253', '5', '0', '146', '169', '169', '0', '0', '821', '655', 'J2', '', 'G大阪', 'J1', '411', '377', '30', '4', '134', '354', '313', '29', '12', '1549', '1345', 'J1', '', 'G大阪', 'J2', '25', '25', '0', '0', '40', '0', '0', '65', '134', '', '']
['チーム', '大会', '総勝', '90勝', '延期', 'PK勝', '分', '総敗', '90敗', '延敗', 'PK敗', '得点', '失点', '現所属DIV']

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

たとえばこういうことですか?
それとも、data__columnsと何か紐付けたいのでしょうか。

python3

1import requests 2from bs4 import BeautifulSoup 3import pandas as pd 4import time 5import os 6url='https://data.j-league.or.jp/SFTD01/search?team_flag=0&competition_frames=1&competition_frames=2&competition_frames=3&competition_year_from=1993&competition_year_to=2020&HomeAwayId=0&competition_frames_name=%EF%BC%AA%EF%BC%91%E3%83%AA%E3%83%BC%E3%82%B0%2C%EF%BC%AA%EF%BC%92%E3%83%AA%E3%83%BC%E3%82%B0%2C%EF%BC%AA%EF%BC%93%E3%83%AA%E3%83%BC%E3%82%B0&competition_year_from_name=1993%E5%B9%B4&competition_year_to_name=2020%E5%B9%B4&teams_name=' 7r=requests.get(url) 8r.raise_for_status() 9r.encoding = r.apparent_encoding 10html=r.text 11 12soup=BeautifulSoup(html,'html.parser') 13 14data=soup.find(class_='table-base00 search-table') 15all_data=data.findAll('tr') 16 17info=[] 18#infoの情報を取得 19data_1=all_data[0].find_all('th') 20#infoにデータを格納 21for i in data_1: 22 info.append(i.get_text()) 23teams = list() 24for i in range(1,len(all_data)): 25 team_info=[] 26 data_2=all_data[i].find_all('td') 27 for j in data_2: 28 team_info.append(j.get_text()) 29 teams.append(team_info) 30data__columns=[info] 31print(teams) 32# [['札幌', 'J1', '79', '76', '3', '0', '43', '159', '140', '15', '4', '355', '524', 'J1', ''], ['札幌', 'J2', '257', '251', '6', '0', '150', '190', '188', '2', '0', '789', '644', 'J1', ''], ...]

データフレームにしたい場合は、最後にこのように

python3

1data_df = pd.DataFrame(teams, columns=data__columns) 2print(data_df) 3""" 4 チーム 大会 総勝 90勝 延勝 PK勝 分 総敗 90敗 延敗 PK敗 得点 失点 現所属DIV 50 札幌 J1 79 76 3 0 43 159 140 15 4 355 524 J1 61 札幌 J2 257 251 6 0 150 190 188 2 0 789 644 J1 72 八戸 J3 18 18 0 0 9 21 21 0 0 65 64 J3 83 岩手 J3 56 56 0 0 51 105 105 0 0 246 330 J3 94 仙台 J1 135 133 2 0 104 176 171 5 0 509 591 J1 10.. ... .. ... ... .. .. ... ... ... .. .. ... ... ... .. 1198 琉球 J3 65 65 0 0 44 54 54 0 0 236 223 J2 1299 F東23 J3 40 40 0 0 31 57 57 0 0 149 175 13100 G大23 J3 43 43 0 0 32 68 68 0 0 202 233 J3 14101 C大23 J3 46 46 0 0 34 63 63 0 0 184 209 J3 15102 J-22 J3 16 16 0 0 13 40 40 0 0 65 134 16 17"""

投稿2020/09/17 06:38

編集2020/09/17 06:40
jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koukiten

2020/09/17 06:46

本当にありがとうございます。 一度チーム情報を空にする必要があったんですね。 勉強になりました。
koukiten

2020/09/17 06:54

データフレームにした場合、ValueError: 1 columns passed, passed data had 15 columnsエラーが出ます。
koukiten

2020/09/17 07:08

解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問