Как правильно спарсить данные в 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)