BeautifulSoup для очистки данных таблицы и сохранения в качестве значений для будущих расчетов - PullRequest
0 голосов
/ 24 февраля 2019

Очень плохо знаком с webscraping, и поэтому я ценю всю помощь.Я пытаюсь построить модель, которая использует значения из справочной таблицы НХЛ, найденной здесь: https://www.hockey -reference.com / leagues / NHL_2019.html #

Я толькопытается получить значения, относящиеся к таблице «Статистика команды», которая содержит совокупные данные команды.Я добился определенного прогресса, но застрял, пытаясь получить данные строк для каждой команды и сохранить их для будущих вычислений.Вот мой код:

from urllib.request import urlopen
import pandas as pd
from bs4 import BeautifulSoup

url = "https://www.hockey-reference.com/leagues/NHL_2019.html"
html = urlopen(url)
soup = BeautifulSoup(html, "lxml")


all_stats = soup.find('div', {'id': 'all_stats'})
print(all_stats)

С этим кодом я могу видеть информацию о строках, которая мне нужна, в форме HTML, но любая попытка получить эти данные приводит к нахождению None.Я полагаю, что я должен назначить каждой команде и тд значение переменной, чтобы я мог вызвать ее в будущем.Есть 30 строк данных, которые мне нужно собрать.

Спасибо за помощь, Джордж

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вариант ответа @Omer Tekbiyik, который также получит данные в информационный кадр:

from bs4 import BeautifulSoup as bs4, Comment
import requests
import pandas as pd

url = "https://www.hockey-reference.com/leagues/NHL_2019.html#"

res= requests.get(url)
soup = bs4(res.content, 'lxml')
table = soup.findAll('table') 
table_with_comment = soup.findAll(text=lambda text:isinstance(text, Comment))
my_table = pd.read_html(table_with_comment[16])
my_table

Выходные данные - это информационный кадр с таблицей Team Statistics;отсюда вы можете запускать на нем все, что можете, на любом фрейме данных pandas.

0 голосов
/ 24 февраля 2019

Причина в том, что Team Statistics таблица находится в строке комментария, поэтому вы ее не анализируете.В этом случае вы можете использовать Comment из bs4, например:

from bs4 import BeautifulSoup , Comment
from urllib import urlopen


search_url = 'https://www.hockey-reference.com/leagues/NHL_2019.html#'

page = urlopen(search_url)
soup = BeautifulSoup(page, "html.parser")

table = soup.findAll('table') ## html part with no comment
table_with_comment = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in table_with_comment]
## print table_with_comment  print all comment line

for c in table_with_comment:
    a = BeautifulSoup(c, "html.parser")
    teams = a.findAll('td', attrs={'class':'left'}) # Team
    values = a.findAll('td', attrs={'class':'right'}) #stats

    for getvalues in values:

        print getvalues.text
    for gettextinElement in teams:
        print gettextinElement.text

ВЫХОД: Для статистики:

27.1
62
47
11
4
98
.790
239
162
5
1
1.26
-0.05
6.47
172
131
61 ..UP TO END

Для команд:

Tampa Bay Lightning
Calgary Flames
Boston Bruins
San Jose Sharks
New York Islanders
Toronto Maple Leafs
Winnipeg Jets
Nashville Predators
Washington Capitals
Columbus Blue Jackets .. UP TO END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...