我有一些Python代码,可将给定季节(例如:the data here)的NBA球员的比赛记录抓取到csv
文件中。我正在使用美丽汤。我知道可以通过单击网站上的链接来获得csv
版本,但是我在每行中都添加了一些内容,因此我觉得逐行抓取是最简单的选择。我们的目标是最终编写出能够在每个球员的每个赛季都做到这一点的代码。
代码如下:
import urllib
from bs4 import BeautifulSoup
def getData(url):
html = urllib.urlopen(url)
soup = BeautifulSoup(html, "html.parser")
type(soup)
file = open('/Users/Mika/Desktop/a_players.csv', 'a')
for table in soup.find_all("pre", class_ = ""):
dataline = table.getText
player_id = player_season_url[47:-14]
file.write(player_id + ',' + dataline + '\n')
file.close()
player_season_url = "https://www.basketball-reference.com/players/a/abdelal01/gamelog/1991/"
getData(player_season_url)
问题是这样的:从检查URL元素可以看出,表中的某些单元格具有空值。
<td class="right " data-stat="fg3_pct"></td>
(这是一个正确粘贴了其中值为(“ 1”)的单元格的示例):
<th scope="row" class="right " data-stat="ranker" csk="1">1</th>
在抓取时,行变得不均匀,跳过空值以创建一个csv
文件,其中值不正确。有没有办法确保将这些空值替换为" "
文件中的csv
?
答案 0 :(得分:1)
用于编写csv文件,Python具有内置支持(模块csv
)。为了从页面中获取整个表格,您可以使用如下脚本:
import requests
from bs4 import BeautifulSoup
import csv
import re
def getData(url):
soup = BeautifulSoup(requests.get(url).text, 'lxml')
player_id = re.findall(r'(?:/[^/]/)(.*?)(?:/gamelog)', url)[0]
with open('%s.csv' % player_id, 'w') as f:
csvwriter = csv.writer(f, delimiter=',', quotechar='"')
d = [[td.text for td in tr.find_all('td')] for tr in soup.find('div', id='all_pgl_basic').find_all('tr') if tr.find_all('td')]
for row in d:
csvwriter.writerow([player_id] + row)
player_season_url = "https://www.basketball-reference.com/players/a/abdelal01/gamelog/1991/"
getData(player_season_url)
输出在CSV文件中(我从LibreOffice添加):
编辑: