Как очистить сайт от нескольких ценностей, которые необходимо заказать - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь оценить результаты игр НХЛ с помощью Beautifulsoup, но у меня возникают трудности с выяснением того, как определить даты, когда были сыграны игры, и результаты по порядку. Даты игр указаны под тегами, а результаты - в классе «field-content». В настоящее время я могу найти оба значения и поместить их в независимые переменные, но я хотел бы сохранить порядок их отображения на исходном веб-сайте и поместить данные в одну переменную.

import bs4 as bs
import urllib.request

sauce = urllib.request.urlopen("https://www.jatkoaika.com/nhl/ottelut").read()

soup = bs.BeautifulSoup(sauce, features="html.parser")

dates = str(soup.find_all("h3"))
dates = dates.replace("<h3>", "").replace("</h3>", "")

games = str(soup.find_all("span", {"class": "field-content"}))
games = games.replace('<span class="field-content">', "").replace("</span>", "")

1 Ответ

1 голос
/ 04 ноября 2019

Трудность анализа этого сайта заключается в отсутствии иерархии элементов заголовка и игр, которые вы хотите проанализировать. Все они являются содержимым одного элемента.

Используйте следующий селектор CSS, чтобы получить элемент h3 и интервалы с классом содержимого поля в один массив

games = soup.select("h3, span.field-content")

Вывод:

[<h3>Ma 28.10.2019 runkosarja</h3>,
 <span class="field-content">Chicago - Los Angeles</span>,
 <span class="field-content">NY Islanders - Philadelphia</span>,
 <span class="field-content">NY Rangers - Boston</span>,
 <span class="field-content">Ottawa - San Jose</span>,
 <span class="field-content">Vegas - Anaheim</span>,
 <h3>Ti 29.10.2019 runkosarja</h3>,
 ...
]

Теперь вы можете использовать следующий код для группировки игры по дате

from collections import defaultdict
dates_with_games = defaultdict(list)
for e in games:
    if (e.name == 'h3'):
        latestH3 = e.text
    else:
        dates_with_games[latestH3].append(e.text)

Вы получаете словарь, который выглядит следующим образом

 {'Ma 28.10.2019 runkosarja': 
  ['Chicago - Los Angeles',
   'NY Islanders - Philadelphia',
   'NY Rangers - Boston',
   'Ottawa - San Jose',
   'Vegas - Anaheim'],
  'Ti 29.10.2019 runkosarja': 
    ['Buffalo - Arizona',
     'Vancouver - Florida'],...
 }
...