Анализ данных из таблицы на веб-сайте с нулевыми записями, введенными как "-" - PullRequest
2 голосов
/ 06 ноября 2019

Снимок экрана статистики Toronto Raptors от 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

Я ожидаю, что программа должна пропустить любые тэги td, которые не имеют class = "pts" или текстовый атрибут, равный "-". После цикла «for point in points» for points_array должен иметь то же количество элементов, что и остальные три массива (names_array, numbers_array, games_array), а все характеристики игрока должны быть с одинаковым индексом в соответствующем массиве.

1 Ответ

0 голосов
/ 07 ноября 2019

Вы можете использовать zip для объединения списков, заменить, чтобы заменить текст, и соседний братский комбинатор, чтобы убедиться, что длина списка для точек такая же, как и у других, так как вы всегда будете принимать значение смежного столбца независимо от класса / без класса.

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')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...