如何在桌子的TD栏旁刮擦TD

时间:2020-07-23 21:47:10

标签: python html flask web-scraping screen-scraping

我对网页抓取还很陌生,但是我正在逐步取得进步。但是对于这个我真的很困难。

我想做的是从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],也许是因为所有tds中都有完整的信息?不是很确定。但是,对于包含DNP玩家td值的tbody [1]和tbody [4],它不起作用,我试图制作一个没有玩的玩家表格,所以我也不需要来自tbody [1]和[4]的其他玩家也玩过,我也不知道如何将其排除在外,因为在这一点上,我已经缺乏解决方案了。

我应该在这里做什么?需要帮助

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试一下。我检查了<tr>是否包含<td>类为dnp的{​​{1}},然后获取<tr>的第一个<td>并将文本附加到{{1} }

data

答案 1 :(得分:0)

您可以使用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) 查找有关球员的所有信息:姓名和球队。

.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))