2016-07-14 37 views
1

我想通过这样的网页解析和收集只首发的名字:美丽的汤战略拆分数据

http://espn.go.com/nba/boxscore?gameId=400827888

我的剧本抓起页面上所有的名字,但我不能区分时,在底部(在这种情况下,亚特兰大)的球队首发球员开始,顶部球队(在这种情况下,底特律)的替补球员结束。真正的问题是,顶级球队的名单上可能会有11-15名球员,所以我不能按照我的理解分割一个数字。如上所述,这给了我活塞的前10个名字 - 而不是前五名活塞队,老鹰队的前5名。我想到的一个策略依赖于标识,但考虑到它们在HTML中编码的方式,这似乎非常棘手。

def parse_boxscore(url): 
    """Gathers names of starters from both teams, stores in list""" 
    soup = make_soup(url) 
    starters = [td for td in soup.findAll("td", "name")] 
    return starters[0:5], starters[6:11] 

任何人都可以想到一致的策略吗?我不太懂技术,所以为了简单起见,我会牺牲相对效率(我知道,我知道)...

+0

顺便说一句,你只需要'首发= soup.findAll( “TD”, “姓名”)' –

+0

你需要找到表格的html元素,然后*为每个表格*,建立一个玩家列表。正如所写,你直接搜索*任何*表 –

+0

感谢您的这个建议! – BSHuniversity

回答

0

如果您使用熊猫而不是美丽的汤,它将分别解析出表格。它只能得到首发,而不是板凳球员,所以希望这不是问题。

import pandas as pd 
pd.read_html('http://www.espn.com.au/nba/boxscore?gameId=400827888') 

[ Unnamed: 0 1 2 3 4 T 
0  DET 25 23 34 24 106 
1  ATL 25 18 23 28 94, 
       starters MIN FG 3PT FT OREB DREB REB AST STL BLK \ 
0   M. MorrisPF 37 6-19 1-4 5-6  5  5 10 4 0 0 
1  E. IlyasovaPF 34 6-12 3-6 1-2  3  4 7 3 0 1 
2  A. DrummondC 37 6-16 0-0 6-10  8 11 19 3 1 2 
3  R. JacksonPG 32 4-10 2-4 5-5  1  7 8 5 2 0 
4 K. Caldwell-PopeSG 37 7-14 4-7 3-3  1  3 4 1 1 0 

    TO PF +/- PTS 
0 0 1 17 18 
1 3 4 20 16 
2 2 4 23 18 
3 2 0 26 15 
4 2 1 17 21 , 
     starters MIN FG 3PT FT OREB DREB REB AST STL BLK TO PF \ 
0 P. MillsapPF 36 7-15 2-6 3-4  1  7 8 3 0 0 2 4 
1 K. BazemoreSF 21 0-3 0-1 0-0  0  7 7 1 0 0 4 3 
2 A. HorfordC 30 6-11 1-3 2-3  1  3 4 4 2 3 1 1 
3 J. TeaguePG 32 7-16 1-3 3-4  0  2 2 4 0 0 5 1 
4 K. KorverSG 29 3-9 1-5 0-0  0  2 2 1 1 0 1 4 

    +/- PTS 
0 -22 19 
1 -17 0 
2 -5 15 
3 -23 18 
4 -9 7 , 
     TEAM W L PCT GB STRK 
0 Cleveland 57 25 0.695 0 L1 
1 Indiana 45 37 0.549 12 W3 
2 Detroit 44 38 0.537 13 W1 
3 Chicago 42 40 0.512 15 W3 
4 Milwaukee 33 49 0.402 24 L2, 
      TEAM W L PCT GB STRK 
0  Miami 48 34 0.585 0 L1 
1  Atlanta 48 34 0.585 0 L2 
2 Charlotte 48 34 0.585 0 W2 
3 Washington 41 41 0.500 7 W3 
4  Orlando 35 47 0.427 13 L1] 
1

如果你想要的是这是很简单的首发,只是拉div.content.hide-板凳中的第一个TBODY,并从td.name提取文本标签:

import requests 
from bs4 import BeautifulSoup 
teams = {} 
page = requests.get('http://espn.go.com/nba/boxscore?gameId=400827888') 

soup = BeautifulSoup(page.content) 


for table in soup.select("div.content.hide-bench"): 
    team = table.select_one("div.table-caption").find(text=True) 
    teams[team] = [tr.select_one("td.name").text for tr in table.find("tbody").find_all("tr")] 
from pprint import pprint as pp 
pp(teams) 

它给你:

{'Hawks': ['P. MillsapPF', 
      'K. BazemoreSF', 
      'A. HorfordC', 
      'J. TeaguePG', 
      'K. KorverSG'], 
'Pistons': ['M. MorrisPF', 
      'E. IlyasovaPF', 
      'A. DrummondC', 
      'R. JacksonPG', 
      'K. Caldwell-PopeSG']}