#python #pandas #beautifulsoup
#python #pandas #beautifulsoup
Вопрос:
Я пытаюсь сделать это с циклом, определяющим данные для извлечения для двух разных URL-адресов, но экспортированный csv включает только данные со второго URL-адреса:
import pandas as pd
import requests
import os
from bs4 import BeautifulSoup
urls=['https://www.basketball-reference.com/players/h/hardeja01/gamelog/2018/',
'https://www.basketball-reference.com/players/h/hardeja01/gamelog/2019/']
for url in urls:
page=requests.get(url)
soup=BeautifulSoup(page.content,'html.parser')
stats=['game_season', 'date_game', 'age', 'team_id', 'game_location', 'opp_id', 'game_result','gs', 'mp', 'fg',
'fga', 'fg_pct', 'fg3', 'fg3a', 'fg3_pct', 'ft', 'fta', 'ft_pct', 'orb','drb', 'trb', 'ast', 'stl', 'blk', 'tov', 'pf', 'pts', 'game_score', 'plus_minus']
stats_left=[[td.getText() for td in soup.findAll('td', {'data-stat': stat})] for stat in stats[:7]]
stats_right=[[td.getText() for td in soup.findAll('td', {'data-stat': stat})] for stat in stats[7:]]
df_left=pd.DataFrame(stats_left).T
df_left.columns=stats[:7]
for i in range(len(df_left)):
if df_left['game_season'][i]=="":
[stats_right[x].insert(i, '') for x in range(len(stats_right))]
df_right=pd.DataFrame(stats_right).T
df_right.columns=stats[7:]
df=pd.concat([df_left, df_right],axis=1)
df.to_csv(r'/Harden_James.csv',index=False)
Интересно, как это будет работать для учета нескольких URL-адресов и временного хранения информации?
Ответ №1:
Вы вроде как ответили на свой собственный вопрос здесь. Вам нужно где-то сохранять фрейм данных после каждой итерации. Итак, что вы могли бы сделать, это просто объединить фреймы данных в список, а затем после цикла объединить этот список фреймов данных в 1 фрейм данных.
Я бы также подумал об использовании pandas
‘ .read_html()
, поскольку вы выполняете большую работу по созданию фрейма данных, когда pandas может просто сделать это за вас (см. Решение 2)
Решение 1:
import pandas as pd
import requests
import os
from bs4 import BeautifulSoup
urls=['https://www.basketball-reference.com/players/h/hardeja01/gamelog/2018/',
'https://www.basketball-reference.com/players/h/hardeja01/gamelog/2019/']
df_list = []
for url in urls:
page=requests.get(url)
soup=BeautifulSoup(page.content,'html.parser')
stats=['game_season', 'date_game', 'age', 'team_id', 'game_location', 'opp_id', 'game_result','gs', 'mp', 'fg',
'fga', 'fg_pct', 'fg3', 'fg3a', 'fg3_pct', 'ft', 'fta', 'ft_pct', 'orb','drb', 'trb', 'ast', 'stl', 'blk', 'tov', 'pf', 'pts', 'game_score', 'plus_minus']
stats_left=[[td.getText() for td in soup.findAll('td', {'data-stat': stat})] for stat in stats[:7]]
stats_right=[[td.getText() for td in soup.findAll('td', {'data-stat': stat})] for stat in stats[7:]]
df_left=pd.DataFrame(stats_left).T
df_left.columns=stats[:7]
for i in range(len(df_left)):
if df_left['game_season'][i]=="":
[stats_right[x].insert(i, '') for x in range(len(stats_right))]
df_right=pd.DataFrame(stats_right).T
df_right.columns=stats[7:]
df=pd.concat([df_left, df_right],axis=1)
df_list.append(df)
df = pd.concat(df_list)
df.to_csv(r'/Harden_James.csv',index=False)
Решение 2:
import pandas as pd
urls=['https://www.basketball-reference.com/players/h/hardeja01/gamelog/2018/',
'https://www.basketball-reference.com/players/h/hardeja01/gamelog/2019/']
df_list = []
for url in urls:
df = pd.read_html(url)[-1]
df = df[df['Rk'] != 'Rk']
df_list.append(df)
df = pd.concat(df_list).reset_index(drop=True)
df.to_csv(r'/Harden_James.csv',index=False)
Вывод:
print (df)
Rk G Date Age ... PF PTS GmSc /-
0 1 1 2017-10-17 28-052 ... 2 27 21.6 1
1 2 2 2017-10-18 28-053 ... 1 27 22.7 1
2 3 3 2017-10-21 28-056 ... 5 29 20.1 31
3 4 4 2017-10-23 28-058 ... 4 22 9.5 -14
4 5 5 2017-10-25 28-060 ... 1 27 21.7 9
5 6 6 2017-10-27 28-062 ... 4 27 22.3 -1
6 7 7 2017-10-28 28-063 ... 3 20 13.7 -13
7 8 8 2017-10-30 28-065 ... 2 29 20.1 -12
8 9 9 2017-11-01 28-067 ... 5 31 16.9 21
9 10 10 2017-11-03 28-069 ... 0 29 28.5 19
10 11 11 2017-11-05 28-071 ... 3 56 49.2 25
11 12 12 2017-11-09 28-075 ... 4 35 35.0 3
12 13 13 2017-11-11 28-077 ... 3 38 26.6 23
13 14 14 2017-11-12 28-078 ... 1 26 25.5 25
14 15 15 2017-11-14 28-080 ... 5 38 23.3 -2
15 16 16 2017-11-16 28-082 ... 3 48 39.4 15
16 17 17 2017-11-18 28-084 ... 3 29 23.8 5
17 18 18 2017-11-22 28-088 ... 1 21 13.5 29
18 19 19 2017-11-25 28-091 ... 1 37 31.3 2
19 20 20 2017-11-27 28-093 ... 2 37 35.0 22
20 21 21 2017-11-29 28-095 ... 2 29 26.2 26
21 22 22 2017-12-03 28-099 ... 3 36 30.1 11
22 23 23 2017-12-07 28-103 ... 2 29 20.0 12
23 24 24 2017-12-09 28-105 ... 2 48 38.4 9
24 25 25 2017-12-11 28-107 ... 3 26 30.8 -2
25 26 26 2017-12-13 28-109 ... 3 21 13.1 -6
26 27 27 2017-12-15 28-111 ... 2 28 20.2 12
27 28 28 2017-12-16 28-112 ... 4 31 19.7 1
28 29 29 2017-12-18 28-114 ... 2 26 19.4 13
29 30 30 2017-12-20 28-116 ... 5 51 37.4 4
.. .. ... ... ... ... ... ... ... ...
134 53 50 2019-02-04 29-162 ... 3 44 37.1 19
135 54 51 2019-02-06 29-164 ... 4 36 25.4 16
136 55 52 2019-02-09 29-167 ... 2 42 22.9 -9
137 56 53 2019-02-11 29-169 ... 1 31 25.8 8
138 57 54 2019-02-13 29-171 ... 2 42 23.9 -14
139 58 55 2019-02-21 29-179 ... 6 30 14.5 -8
140 59 NaN 2019-02-23 29-181 ... Inactive Inactive Inactive Inactive
141 60 56 2019-02-25 29-183 ... 1 28 14.2 5
142 61 57 2019-02-27 29-185 ... 2 30 20.4 -14
143 62 58 2019-02-28 29-186 ... 1 58 52.2 10
144 63 59 2019-03-03 29-189 ... 6 42 26.7 13
145 64 60 2019-03-05 29-191 ... 4 35 21.6 -10
146 65 61 2019-03-08 29-194 ... 3 31 23.3 15
147 66 62 2019-03-10 29-196 ... 5 20 3.7 4
148 67 63 2019-03-11 29-197 ... 3 28 22.7 11
149 68 64 2019-03-13 29-199 ... 1 29 24.6 1
150 69 65 2019-03-15 29-201 ... 3 41 38.4 3
151 70 66 2019-03-17 29-203 ... 4 20 10.4 20
152 71 67 2019-03-19 29-205 ... 1 31 27.9 10
153 72 68 2019-03-20 29-206 ... 3 57 44.2 11
154 73 69 2019-03-22 29-208 ... 3 61 46.0 18
155 74 70 2019-03-24 29-210 ... 1 28 17.7 14
156 75 71 2019-03-26 29-212 ... 4 23 11.7 -14
157 76 72 2019-03-28 29-214 ... 2 38 29.9 14
158 77 73 2019-03-30 29-216 ... 1 50 40.4 17
159 78 74 2019-04-02 29-219 ... 2 36 33.2 29
160 79 75 2019-04-03 29-220 ... 3 31 23.5 16
161 80 76 2019-04-05 29-222 ... 2 26 21.1 29
162 81 77 2019-04-07 29-224 ... 3 30 28.4 39
163 82 78 2019-04-09 29-226 ... 4 39 25.0 1
[164 rows x 30 columns]