Попытка вырвать плей-офф из Википедии, используя красивый суп. Как определить правильные столбцы? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь убрать скобки плей-офф НХЛ из Википедии в течение 1988 года, используя прекрасный суп 4 в питоне.Непоследовательное форматирование (иногда есть несколько команд подряд, см .: (https://en.wikipedia.org/wiki/2004_Stanley_Cup_playoffs) усложняет задачу. Я бы хотел определить количество выигранных команд, раундов и количество игр для каждой серии в этом году.

Изначально я преобразовал таблицу в текст и использовал регулярные выражения для определения команд и информации, но порядок меняется в зависимости от того, позволяют ли скобки более одной команды в строке или нет.

Теперь я пытаюсь пройтись по строкам и посчитать такие вещи, как количество ячеек / столбцов, но результаты противоречивы. Мне не хватает того, как определяются команды 4-го раунда.

Что ядо сих пор есть попытка подсчитать количество ячеек до того, как будет достигнута ячейка с командой ...

from bs4 import BeautifulSoup as soup
hockeyteams = ['Anaheim','Arizona','Atlanta','Boston','Buffalo','Calgary','Carolina','Chicago','Colorado','Columbus','Dallas','Detroit',
               'Edmonton','Florida','Hartford','Los Angeles','Minnesota','Montreal','Nashville','New Jersey',
               'Ottawa','Philadelphia','Pittsburgh','Quebec','San Jose','St. Louis','Tampa Bay','Toronto','Vancouver','Vegas','Washington',
               'Winnipeg','NY Rangers','NY Islanders']

#fetch the content from the url from the library
page_response = requests.get(full_link, timeout=5)
#use the html parser to parse the url
page_content = soup(page_response.content, "html.parser")

tables = page_content.find_all('table')
cnt = 0

#identify the appropriate table
for table in tables:
    if ('Semi' in table.text) & ('Stanley Cup Finals' in table.text):
        bracket = table
        break
row_num = 0        
for row in bracket.find_all('tr'):
    row_num += 1
    print(row_num,'#')
    colcnt = 0
    for col in row.find_all('td'):
        if "colspan" in col.attrs:
            colcnt += int(col.attrs['colspan'])
        else:
            colcnt += 1
        if (col.text.strip(' \n') in str(hockeyteams)):
            print(colcnt,col.text)


    print('col width:',colcnt)

В конечном итоге я хотел бы что-то вроде кадра данных, который имеет:

Команда раунда Команда А побеждает, Команда Б Команда Б выигрывает
1, Тампа Бэй, 4, Нью-Йорк Айлендерс, 1
2, Тампа Бэй, 4, Монреаль, 0

и т. Д.

1 Ответ

0 голосов
/ 06 мая 2019

Этот стол можно почистить с помощью панд:

import pandas as pd
tables = pd.read_html('https://en.wikipedia.org/wiki/2004_Stanley_Cup_playoffs#Playoff_bracket')

bracket = tables[2].dropna(axis=1, how='all').dropna(axis=0, how='all')
print(bracket)

Вывод полон NaN с, но он имеет то, что я думаю, что вы ищете, и вы можете изменить его, используя стандартные методы панд.

...