Pandas имеет очень полезный метод для чтения html напрямую. Это особенно полезно, если вы хотите получить информацию из таблиц, которая применима к вам. По сути, pandas будет очищать веб-сайт для любых таблиц и считывать таблицы как кадры данных. Подробнее об этом здесь
Проблема здесь в том, что вам необходим доступ к ссылке на проигрывателе, а метод read_html
считывает таблицу как текст и не учитывает теги. .
Тем не менее, я нашел возможное решение. Это ни в коем случае не лучший, но, надеюсь, вы можете использовать и улучшить его.
Подход:
- Считайте таблицу, используя
read_html
метод - Получить необходимое имя игрока из-за стола (игрок с
NBA != '-'
) - Может быть несколько игроков с таким именем - скажем, есть 3
Sergio Rodriguez
, но только 2-й игрок сыграл в НБА. - вам понадобится этот индекс, то есть index=1
(предполагается, что начальный индекс равен 0), чтобы найти ссылку позже - Чтобы получить индекс, мы запрашиваем у таблицы имя игрока и получаем индексное местоположение этого игрока .
- Теперь мы ищем все ссылки, текст которых
Sergio Rodriguez
- Мы выбираем только ссылку с соответствующим индексом, т. Е. Если индекс равен 1 (начиная с 0), мы выбираем 2-я ссылка с текстом ==
Sergio Rodriguez
import pandas as pd
import requests
from bs4 import BeautifulSoup
# read the data from the website as a list of dataframes (tables)
web_data = pd.read_html('https://basketball.realgm.com/search?q=Sergio+Rodriguez')
# the table you need is the second to last one
required_table = web_data[len(web_data)-2]
print (required_table)
>>>
Player Pos HT WT Birth Date Draft Year College NBA
0 Sergio Rodriguez Febles SF 6-7 202 Oct 18, 1993 2015 - -
1 Sergio Rodriguez PG 6-3 176 Jun 12, 1986 2006 - NYK, PHL, POR, SAC
2 Sergio Rodriguez SG 6-4 - Oct 12, 1977 1999 - -
### get the player name who has played in NBA
required_player_name = required_table.loc[required_table['NBA']!='-']['Player'].values[0]
print (required_player_name)
>>>
Sergio Rodriguez
## check for duplicate players with this name (reset index so that we get the indices of player with the same name in order)
table_with_player = required_table.loc[(required_table['Player']==required_player_name)].reset_index(drop=True)
# get the indices of player where NBA is not '-'
index_of_player_to_get = list(table_with_player[table_with_player['NBA']!='-'].index)[0]
print (index_of_player_to_get)
### basically if indices_of_player_to_get = 2 (say) then we need the 3rd link with player name == required_player_name
>>>
0
Теперь мы можем прочитать все ссылки и вытащить ссылку на позиция index_of_player_to_get
среди всех ссылок с именем Sergio Rodriguez
url='https://basketball.realgm.com/search?q=Sergio+Rodriguez'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
## get all links
all_links = soup.find_all('a', href=True)
link_idx = -1
for link in all_links:
if link.text == required_player_name:
# player name found, inc link_idx
link_idx+=1
if link_idx == index_of_player_to_get:
print (link['href'])
>>>
/player/Sergio-Rodriguez/Summary/85