Как очистить данные из нескольких URL-адресов для сохранения в виде одного CSV-файла с упорядоченной датой?

#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]