如何提取整个表格并将其存储在CSV文件中?

问题描述 投票:-1回答:2

我正在尝试删除整个表,并希望将其存储在.csv文件中。当我尝试抓取此数据时,它显示为NO TABLES FOUND。

这是我的代码。

from pandas.io.html import read_html
page = 'https://games.crossfit.com/leaderboard/open/2020?view=0&division=1&scaled=0&sort=0'

tables = read_html(page,  attrs={"class":"desktop athletes"})

print ("Extracted {num} tables".format(num=len(tables)))

任何建议或指导或任何帮助?

python csv web-scraping screen-scraping extraction
2个回答
2
投票

此页面使用JavaScript从服务器获取数据并生成表。

但是在Chrome / Firefox中使用DevTool,您可以看到(在Network选项卡中)从浏览器到服务器的所有请求,并且XHR/AJAX请求之一以JSON格式获取所有数据,因此您可以使用此网址也可以将其作为JSON获得,您可以将其转换为Python数据,而不必将其刮取。

import requests

r = requests.get('https://games.crossfit.com/competitions/api/v1/competitions/open/2020/leaderboards?view=0&division=1&scaled=0&sort=0')

data = r.json()

for row in data['leaderboardRows']:
    print(row['entrant']['competitorName'], row['overallScore'], [(x['rank'],x['scoreDisplay']) for x in row['scores']])

结果

Patrick Vellner 64 [('13', '8:38'), ('19', '988 reps'), ('12', '6:29'), ('18', '16:29'), ('2', '10:09')]
Mathew Fraser 74 [('8', '8:28'), ('40', '959 reps'), ('3', '6:08'), ('2', '14:22'), ('21', '10:45')]
Lefteris Theofanidis 94 [('1', '8:05'), ('3', '1021 reps'), ('13', '6:32'), ('4', '15:00'), ('73', '11:11')]
# ... more ...

0
投票

如下所述,您可以访问api以获取数据。要保存为CSV,您需要遍历json格式以获取所需的内容(即,将嵌套数据展平)。有两种方法可以完成此操作:a)将其完全展平,以使每一行适合每个参赛者,或者b)每个参赛者针对其每个序数得分都有单独的行。

唯一的区别是,如果选择a)您将拥有一张非常宽的表(但没有重复的数据),并且如果选择b)您将拥有一张有重复的数据的长表。

由于文件不算太大,我使用了选项b),因此您始终可以按特定的列或过滤器进行分组:

import requests
import pandas as pd

r = requests.get('https://games.crossfit.com/competitions/api/v1/competitions/open/2020/leaderboards?view=0&division=1&scaled=0&sort=0')

data = r.json()

results = pd.DataFrame()
df = pd.DataFrame(data['leaderboardRows'])

for idx, row in df.iterrows():
    entrantData = pd.Series()
    scoresData = pd.DataFrame()
    entrantResults = pd.DataFrame()
    for idx2, each in row.iteritems():
        if type(each) == dict:
            temp = pd.DataFrame.from_dict(each, orient='index')
            entrantData = entrantData.append(temp)
        elif type(each) == list:
            temp2 = pd.DataFrame(each)
            scoresData = scoresData.append(temp2, sort=True).reset_index(drop=True)
        else:
            entrantData = entrantData.append(pd.Series(each, name=idx2))

    entrantResults = entrantResults.append(scoresData, sort=True).reset_index(drop=True)
    entrantResults = entrantResults.merge(pd.concat([entrantData.T] *5, ignore_index=True), left_index=True, right_index=True)

    results = results.append(entrantResults, sort=True).reset_index(drop=True)

results.to_csv('file.csv', index=False)

输出:前15行,共250行

print (results.head(15).to_string())
               affiliate affiliateId     affiliateName age                                   breakdown competitorId        competitorName countryChampion countryOfOriginCode countryOfOriginName divisionId drawBlueHR firstName gender heat  height highlight             judge lane     lastName mobileScoreDisplay nextStage  ordinal overallRank overallScore postCompStatus          profilePicS3key rank scaled       score scoreDisplay       scoreIdentifier status time video  weight
0       CrossFit Nanaimo        1918  CrossFit Nanaimo  30                                   10 rounds       158264       Patrick Vellner           False                  CA              Canada          1        NaN   Patrick      M        71 in     False     Dallyn Giroux           Vellner                                     1           1           64                 d471c-P158264_7-184.jpg   13      0    11800382         8:38  9d3979222412df2842a1    ACT  518     0  195 lb
1    CrossFit Soul Miami        1918  CrossFit Nanaimo  30                  29 rounds +\n2 thrusters\n       158264       Patrick Vellner           False                  CA              Canada          1        NaN   Patrick      M        71 in     False      Lamar Vernon           Vellner                                     2           1           64                 d471c-P158264_7-184.jpg   19      0  1009880000     988 reps  9bd66b00e8367cc7fd0c    ACT  NaN     0  195 lb
2       CrossFit Nanaimo        1918  CrossFit Nanaimo  30                                    165 reps       158264       Patrick Vellner           False                  CA              Canada          1        NaN   Patrick      M        71 in     False    Jason Lochhead           Vellner                                     3           1           64                 d471c-P158264_7-184.jpg   12      0  1001650151         6:29  2347b4cb7339f2a13e6c    ACT  389     0  195 lb
3       CrossFit Nanaimo        1918  CrossFit Nanaimo  30                                    240 reps       158264       Patrick Vellner           False                  CA              Canada          1        NaN   Patrick      M        71 in     False     Dallyn Giroux           Vellner                                     4           1           64                 d471c-P158264_7-184.jpg   18      0  1002400211        16:29  bcfd3882df3fa2e99451    ACT  989     0  195 lb
4   CrossFit New England        1918  CrossFit Nanaimo  30                                    240 reps       158264       Patrick Vellner           False                  CA              Canada          1        NaN   Patrick      M        71 in     False      Matt O'Keefe           Vellner                                     5           1           64                 d471c-P158264_7-184.jpg    2      0  1002400591        10:09  4bb25bed5f71141da122    ACT  609     0  195 lb
5        CrossFit Mayhem        3220   CrossFit Mayhem  30                                   10 rounds       153604         Mathew Fraser            True                  US       United States          1        NaN    Mathew      M        67 in     False  darren hunsucker            Fraser                                     1           2           74                 9e218-P153604_4-184.jpg    8      0    11800392         8:28  18b5b2e137f00a2d9d7d    ACT  508     0  195 lb
6    CrossFit Soul Miami        3220   CrossFit Mayhem  30  28 rounds +\n4 thrusters\n3 toes-to-bars\n       153604         Mathew Fraser            True                  US       United States          1        NaN    Mathew      M        67 in     False      Daniel Lopez            Fraser                                     2           2           74                 9e218-P153604_4-184.jpg   40      0  1009590000     959 reps  b96bc1b7b58fa34a28a1    ACT  NaN     0  195 lb
7        CrossFit Mayhem        3220   CrossFit Mayhem  30                                    165 reps       153604         Mathew Fraser            True                  US       United States          1        NaN    Mathew      M        67 in     False   Jason Fernandez            Fraser                                     3           2           74                 9e218-P153604_4-184.jpg    3      0  1001650172         6:08  4f4a994a045652c894c5    ACT  368     0  195 lb
8        CrossFit Mayhem        3220   CrossFit Mayhem  30                                    240 reps       153604         Mathew Fraser            True                  US       United States          1        NaN    Mathew      M        67 in     False   Tasia Percevecz            Fraser                                     4           2           74                 9e218-P153604_4-184.jpg    2      0  1002400338        14:22  1a4a7d8760e72bb12d68    ACT  862     0  195 lb
9        CrossFit Mayhem        3220   CrossFit Mayhem  30                                    240 reps       153604         Mathew Fraser            True                  US       United States          1        NaN    Mathew      M        67 in     False    Kelley Jackson            Fraser                                     5           2           74                 9e218-P153604_4-184.jpg   21      0  1002400555        10:45  b4a259e7049f47f65356    ACT  645     0  195 lb
10                   NaN           0                    30                                   10 rounds       514502  Lefteris Theofanidis            True                  GR              Greece          1        NaN  Lefteris      M       171 cm     False               NaN       Theofanidis                                     1           3           94                 931eb-P514502_2-184.jpg    1      0    11800415         8:05  c8907e02512f42ff3142    ACT  485     1   81 kg
11                   NaN           0                    30                   30 rounds +\n1 thruster\n       514502  Lefteris Theofanidis            True                  GR              Greece          1        NaN  Lefteris      M       171 cm     False               NaN       Theofanidis                                     2           3           94                 931eb-P514502_2-184.jpg    3      0  1010210000    1021 reps  63add31b22606957701c    ACT  NaN     1   81 kg
12                   NaN           0                    30                                    165 reps       514502  Lefteris Theofanidis            True                  GR              Greece          1        NaN  Lefteris      M       171 cm     False               NaN       Theofanidis                                     3           3           94                 931eb-P514502_2-184.jpg   13      0  1001650148         6:32  46d7cdb691c25ea38dbe    ACT  392     1   81 kg
13                   NaN           0                    30                                    240 reps       514502  Lefteris Theofanidis            True                  GR              Greece          1        NaN  Lefteris      M       171 cm     False               NaN       Theofanidis                                     4           3           94                 931eb-P514502_2-184.jpg    4      0  1002400300        15:00  d49e55a2af5840740071    ACT  900     1   81 kg
14                   NaN           0                    30                                    240 reps       514502  Lefteris Theofanidis            True                  GR              Greece          1        NaN  Lefteris      M       171 cm     False               NaN       Theofanidis                                     5           3           94                 931eb-P514502_2-184.jpg   73      0  1002400529        11:11  d35c9d687eb6b72c8e36    ACT  671     1   81 kg
© www.soinside.com 2019 - 2024. All rights reserved.