Как правильно спарсить данные в chess.com?

Мой код:

import requests
from bs4 import BeautifulSoup

url = "https://www.chess.com/ratings"
response = requests.get(url)
html = response.text

soup = BeautifulSoup(html, 'html.parser')

# Находим таблицу с рейтингами
table = soup.find('table', {'class': 'table-component'})

output = ""

for row in table.find_all('tr')[1:]:  # Пропускаем первую строку, так как она содержит заголовки столбцов
    columns = row.find_all('td')

    rank_element = columns[0].find('div', {'class': 'master-players-rating-rank'})
    rank_text = rank_element.get_text(strip=True) if rank_element else ""
    
    player_name_element = columns[1]
    player_name_element.find('div', {'class': 'user-chess-title'}).decompose()
    player_name = player_name_element.get_text(strip=True)

    rating_element = columns[2].find('span', {'class': 'master-players-rating-sort'})
    player_rating = rating_element.text if rating_element else ""

    output += f"Ранг: {rank_text}, Игрок: {player_name}, Рейтинг: {player_rating}\n"

output = "\n".join([line.strip() for line in output.split("\n") if line.strip()])

print(output)

Проблема заключается в том, что при парсинге не выходит рейтинг игрока и место игрока ломается из-за элемента недавнего изменения места игрока в рейтинге и изменение его elo.


Ответы (1 шт):

Автор решения: Сергей Ш
import requests
from bs4 import BeautifulSoup

output = ""
url = "https://www.chess.com/ratings"
response = requests.get(url)    
soup = BeautifulSoup(response.text, 'html.parser')

for row in soup('tr')[1:]:  # Пропускаем первую строку, так как она содержит заголовки столбцов
    rank_element = list(row.find(class_="master-players-rating-rank").stripped_strings)
    rank_text = rank_element[0] if len(rank_element) == 1 else rank_element[1]
    player_name = row.find(class_='master-players-rating-username').text.strip()
    player_rating = row.find(class_="master-players-rating-rank-active").text.strip()

    output += f"Ранг: {rank_text}, Игрок: {player_name}, Рейтинг: {player_rating}\n"

print(output)
→ Ссылка