用于分割数据的美丽汤策略

时间:2016-07-14 04:11:49

标签: python macos beautifulsoup iteration

我想通过这样的网页解析并只收集初学者的名字:

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

我的脚本抓住了页面上的所有名字,但我不能区分底部球队的首发球员(在这种情况下是亚特兰大)何时开始以及球队的替补球员在哪里(在这种情况下是底特律)结束。真正的问题是,顶级球队在他们列出的名单上可以有11-15个人,所以我不能按照我的理解分成一个数字。

正如所写的那样,这给了我活塞的前10个名字 - 不是前五个活塞,前五个是老鹰队。我认为一种策略依赖于徽标,但考虑到它们在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]

有人能想到一致的策略吗?我不是非常精通技术,所以我会牺牲相对效率来简化(我知道,我知道)......

2 个答案:

答案 0 :(得分:1)

如果您想要的只是初学者,那么它非常简单,只需在 div.content.hide-bench 中拉出第一个tbody,然后从 td.name <中提取文本< / em>标签:

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']}

答案 1 :(得分:0)

如果您使用熊猫而不是漂亮的汤,它将分别解析表格。它只能得到首发球员,而不是替补球员,所以希望这不是一个问题。

<?xml version="1.0" encoding="utf-8"?>
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:buttonTint="@color/colorPrimary"
    android:text="">

</RadioButton>