2016-07-14 166 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']}