解析网站上一个表中的数据,其中零项输入为“-”

时间:2019-11-06 18:34:37

标签: python html web-scraping beautifulsoup

Screenshot of Toronto Raptors Stats from nba.com 我正在尝试从nba.com上找到的表中解析数据,但问题是零条目未输入为“ 0”,而是输入为“-”。

如果条目不为零,则包含在具有特定类的td标记中(例如,点为class =“ pts” 25)。如果条目为零,则td标签没有类,而只是-。

我正在使用漂亮的汤类库来解析此数据,并且尝试查找所有td标签并使用if语句,以便将“ 0”附加到我的数组中,而不是“-”字符(请参见代码)。当我以CSV格式打印出玩家名称,号码,玩过的游戏和分数时,这些分数不会打印在正确的玩家旁边。

points = soup.find_all("td")

for point in points:

    if point.has_attr("class") and point["class"][0]=="pts":
        points_array.append(point.text)
    elif point.text=="—":
        points_array.append("0")
    else:
        pass

我希望程序应跳过所有没有class =“ pts”或text属性等于“-”的td标签。在“ for point in points” for循环之后,points_array的元素数应与其他三个数组(names_array,numbers_array,games_array)相同,并且所有玩家的统计信息应在相应数组中的同一索引处。

1 个答案:

答案 0 :(得分:0)

您可以使用zip连接列表,使用replace替换文本和相邻的同级组合器,以确保点的列表长度与其他列表相同,因为无论类/无类,您将始终获取相邻列的值。

import csv, requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.nba.com/raptors/stats')
soup = bs(r.content, 'lxml')

with open("nba.csv", "w", encoding="utf-8-sig", newline='') as csv_file:
    w = csv.writer(csv_file, delimiter = ",", quoting=csv.QUOTE_MINIMAL)
    w.writerow(['Name','Number','Games Played','Points'])

    for name, number, games, points in zip(soup.select('.playerName a'), soup.select('.playerNumber'), soup.select('td.gp'), soup.select('td.gp + td')):
        w.writerow([name.text, number.text, games.text, points.text.replace('—','0')])