Я использовал l oop для игроков NBA с похожими именами. Вы можете найти ниже css селектор ниже, чтобы получить игроков NBA из таблицы поиска:
.tablesaw tr:has(a[href*="/nba/teams/"]) a[href*="/player/"]
CSS селектор, означающий : найти таблицу по классу tablesaw
, найти детей таблицы tr
с детьми a
, чей href
содержит /nba/teams/
текст, затем найдите a
, чей href
содержит /player/
Я добавил Поиск имени игрока и Реальное имя игрока столбцы, которые вы можете увидеть, как был найден игрок. Этот столбец размещается как первый и второй столбец с использованием insert
(см. Комментарий в коде).
import requests
from bs4 import BeautifulSoup
import pandas as pd
from pandas import DataFrame
base_url = 'https://basketball.realgm.com'
player_names = ['Carlos Delfino', 'Nene', 'Yao Ming', 'Marcus Vinicius', 'Raul Neto', 'Timothe Luwawu-Cabarrot']
result = pd.DataFrame()
def def get_player_stats(search_name = None, real_name = None, player_soup = None):
table_per_game = player_soup.find('h2', text='International Regular Season Stats - Per Game')
table_advanced_stats = player_soup.find('h2', text='International Regular Season Stats - Advanced Stats')
if table_per_game and table_advanced_stats:
print('International table for %s.' % search_name)
df1 = pd.read_html(str(table_per_game.findNext('table')))[0]
df2 = pd.read_html(str(table_advanced_stats.findNext('table')))[0]
common_cols = list(set(df1.columns) & set(df2.columns))
df = df1.merge(df2, how='left', on=common_cols)
# insert name columns for the first positions
df.insert(0, 'Search Player Name', search_name)
df.insert(1, 'Real Player Name', real_name)
else:
print('No international table for %s.' % search_name)
df = pd.DataFrame([[search_name, real_name]], columns=['Search Player Name', 'Real Player Name'])
return df
for name in player_names:
url = f'{base_url}/search?q={name.replace(" ", "+")}'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
if url == response.url:
# Get all NBA players
for player in soup.select('.tablesaw tr:has(a[href*="/nba/teams/"]) a[href*="/player/"]'):
response = requests.get(base_url + player['href'])
player_soup = BeautifulSoup(response.content, 'lxml')
player_data = get_player_stats(search_name=player.text, real_name=name, player_soup=player_soup)
result = result.append(player_data, sort=False).reset_index(drop=True)
else:
player_data = get_player_stats(search_name=name, real_name=name, player_soup=soup)
result = result.append(player_data, sort=False).reset_index(drop=True)
result.to_csv('international players.csv', index=False)
# Append to existing file
# result.to_csv('international players.csv', index=False, mode='a')