【问题标题】:How to scrape a td beside a td colspan of table如何在表格的 td colspan 旁边刮一个 td
【发布时间】:2020-11-13 17:31:31
【问题描述】:

我对网络抓取很陌生,但我正在一点一点地取得进步;但是对于这个,我真的很难过。

我想做的是从 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] 的其他玩家也玩过,我也不知道如何排除,因为此时我已经缺乏解决方案。

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    试试这个。我检查了<tr> 是否包含<td> 具有类dnp 然后获取<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)
    

    【讨论】:

    • 这也有效,我先把它们放在字典里,谢谢@Kaushal
    • 作为新用户,我想告诉您,如果您发现一个有用的答案,您可以投票并将其标记为已接受,以便其他有类似问题的人受益。
    【解决方案2】:

    您可以使用.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
    

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 2016-07-26
      • 2020-03-18
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多