我对网络抓取很陌生,但我正在一点一点地进步;不过这次我真的很难过。
我想做的是从ESPN NBA boxscore网站上抓取:http://espn.com/nba/boxscore?gameId=401160948
我想把没有参加比赛的球员的名字(用"DNP"标记(,然后在两个表的末尾加上原因,并把它们附加在一个列表中。
这是我的代码:
from bs4 import BeautifulSoup
page = requests.get('https://espn.com/nba/boxscore?gameId=401160948')
soup = BeautifulSoup(page.content, 'html.parser')
main_container = soup.find(id='main-container')
data = []
for hstat in main_container.find_all('tbody')[0]:
player_info = {}
player_info['name'] = hstat.find("td", {"class": "name"}).find('span').get_text()
data.append(player_info)
print(data)
上面的代码适用于tbody[0]和tbody[2],可能是因为所有td中都有完整的信息?不太确定。然而,对于包含DNP的玩家td值的tbody[1]和tbody[4],这是不起作用的,我正在尝试制作一个没有玩过的玩家表,所以我也不需要玩过的tbody[1][4]中的其他玩家,我也不知道如何排除,因为在这一点上,我已经缺乏解决方案。
我在这里该怎么办?需要帮助
谢谢。
您可以使用.find_previous()
查找有关球员的所有信息:姓名和球队。
import requests
from bs4 import BeautifulSoup
url = 'https://www.espn.com/nba/boxscore?gameId=401160948'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
for td in soup.select('td.dnp'):
team = td.find_previous('div', class_='team-name').text
reason = td.text.split('-')[-1]
name = td.find_previous('span', class_='').text
print('{:<20} {:<20} {}'.format(name, team, reason))
打印:
J. Evans Warriors LEFT ADDUCTOR STRAIN
M. Kidd-Gilchrist Hornets COACH'S DECISION
C. Martin Hornets COACH'S DECISION
W. Hernangomez Hornets COACH'S DECISION
试试这个。我检查了<tr>
是否包含类为dnp
的<td>
,然后获取<tr>
的第一个<td>
并将文本附加到data
import requests
from bs4 import BeautifulSoup
page = requests.get('https://espn.com/nba/boxscore?gameId=401160948')
soup = BeautifulSoup(page.content, 'html.parser')
main_container = soup.find(id='main-container')
data = []
for tbody_soup in main_container.find_all('tbody'):
# print(tbody_soup)
player_info = {}
for tr_soup in tbody_soup:
if tr_soup.find("td", {"class": "dnp"}) is not None:
data.append(tr_soup.find("td", {"class": "name"}).find('span').get_text())
print(data)