美丽的汤-刮破空值

时间:2018-07-21 19:51:25

标签: python web-scraping beautifulsoup

我有一些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

1 个答案:

答案 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添加):

enter image description here

编辑:

  • 从URL中提取player_id
  • 文件保存在{player_id} .csv