Как очистить для конкретных таблиц и конкретных строк / ячеек данных Python

Итак, это мой первый проект на Python, и моя цель состоит в том, чтобы собрать окончательный счет из игры Mets прошлой ночи и отправить его другу через twilio, но сейчас у меня возникают проблемы с извлечением результатов из этого веб-сайта:

http://scores.nbcsports.com/mlb/scoreboard.asp?day=20160621&meta=true

Скребок ниже работает, но он явно находит все таблицы / строки / ячейки, а не ту, которую я хочу. Когда я смотрю HTML-код для каждой таблицы, они все одинаковы:

<table class="shsTable shsLinescore" cellspacing="0">

Мой вопрос: как я могу очистить конкретную таблицу, если атрибут класса для всех игр одинаков?

from bs4 import BeautifulSoup
import urllib
import urllib.request

def make_soup(url):
    thepage = urllib.request.urlopen(url)
    soupdata = BeautifulSoup(thepage, "html.parser")
    return soupdata

playerdatasaved =""


soup = make_soup("http://scores.nbcsports.com/mlb/scoreboard.asp?     day=20160621&meta=true")

for row in soup.findAll('tr'): #finds all rows
    playerdata=""
    for data in row.findAll('td'):
        playerdata = playerdata+","+data.text
    playerdatasaved =playerdatasaved+"\n" +playerdata[1:]

print(playerdatasaved)

1 ответ

Используйте название команды, которое есть в тексте якорей с teamName класс, найдите это, затем потяните предыдущую таблицу:

from bs4 import BeautifulSoup
import requests

soup = BeautifulSoup(requests.get("http://scores.nbcsports.com/mlb/scoreboard.asp?day=20160621&meta=true").content, "lxml")

table = soup.find("a",class_="teamName", text="NY Mets").find_previous("table")
for row in table.find_all("tr"):
    print(row.find_all("td"))

Что дает вам:

[<td style="text-align: left">Final</td>, <td class="shsTotD">1</td>, <td class="shsTotD">2</td>, <td class="shsTotD">3</td>, <td class="shsLinescoreSpacer">\xa0</td>, <td class="shsTotD">4</td>, <td class="shsTotD">5</td>, <td class="shsTotD">6</td>, <td class="shsLinescoreSpacer">\xa0</td>, <td class="shsTotD">7</td>, <td class="shsTotD">8</td>, <td class="shsTotD">9</td>, <td class="shsLinescoreSpacer">\xa0</td>, <td class="shsTotD">R</td>, <td class="shsTotD">H</td>, <td class="shsTotD">E</td>]
[<td class="shsNamD" nowrap=""><span class="shsLogo"><span class="shsMLBteam7sm_trans"></span></span><a class="teamName" href="/mlb/teamstats.asp?team=07&amp;type=teamhome">Kansas City</a></td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td></td>, <td class="shsTotD">0</td>, <td class="shsTotD">1</td>, <td class="shsTotD">0</td>, <td></td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td></td>, <td class="shsTotD">1</td>, <td class="shsTotD">7</td>, <td class="shsTotD">0</td>]
[<td class="shsNamD" nowrap=""><span class="shsLogo"><span class="shsMLBteam21sm_trans"></span></span><a class="teamName" href="/mlb/teamstats.asp?team=21&amp;type=teamhome">NY Mets</a></td>, <td class="shsTotD">1</td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td></td>, <td class="shsTotD">1</td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td></td>, <td class="shsTotD">0</td>, <td class="shsTotD">0</td>, <td class="shsTotD">x</td>, <td></td>, <td class="shsTotD">2</td>, <td class="shsTotD">6</td>, <td class="shsTotD">1</td>]

Чтобы получить данные счета:

from bs4 import BeautifulSoup
import requests

soup = BeautifulSoup(requests.get("http://scores.nbcsports.com/mlb/scoreboard.asp?day=20160621&meta=true").content, "lxml")

table = soup.find("a",class_="teamName", text="NY Mets").find_previous("table")

a, b = [a.text for a in table.find_all("a",class_="teamName")]

inn, a_score, b_score = ([td.text for td in row.select("td.shsTotD")] 


print " ".join(inn)
print "{}: {}".format(a, " ".join(a_score))
print "{}: {}".format(b, " ".join(b_score))

Что дает вам:

1 2 3 4 5 6 7 8 9 R H E
Kansas City: 0 0 0 0 1 0 0 0 0 1 7 0
NY Mets: 1 0 0 1 0 0 0 0 x 2 6 1
Другие вопросы по тегам