首页 > 解决方案 > 如何提取整个表并将其存储在 CSV 文件中?

问题描述

我正在尝试抓取整个表格并希望将其存储在 .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)))

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

标签: pythoncsvweb-scrapingextractscreen-scraping

解决方案


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

但是DevTool在 Chrome/Firefox 中使用,您可以看到(在 tab 中Network)从浏览器到服务器的所有请求,其中一个XHR/AJAX请求以格式获取所有数据,JSON因此您也可以使用此 url 来获取它,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 ...

推荐阅读