Объясните, пожалуйста, почему выводится только один элемент

from selenium import webdriver
import time
from bs4 import BeautifulSoup
import requests

to_write = {}
link = 'https://www.flashscore.ru/'

def get_shedule_data(link):
    try:
        browser = webdriver.Chrome()
        browser.get(link)
        time.sleep(15)
        root_div = browser.find_element_by_css_selector('.sportName').get_attribute('innerHTML')
        soup = BeautifulSoup(root_div, 'lxml')
        all_events = soup.find_all('div', class_='event__match')
        for event in all_events:
            team1 = event.find('div', class_='event__participant--home').text
            team2 = event.find('div', class_='event__participant--away').text
            to_write['team1'] = team1
            to_write['team2'] = team2
        print(to_write)

    finally:

        browser.quit()

def main():
    get_shedule_data(link)

if __name__ == "__main__":
    main()

На выходе следующее: {'team1': 'Маккаби Нетания (Изр)', 'team2': 'Бейтар Тель Авив (Изр)'} Изначально предполагалось, что каждый полученный элемент в результате прохождения цикла будет записываться в словарь. Подскажите, пожалуйста, где я ошибся.


Ответы (1 шт):

Автор решения: MarianD

Вместо

to_write = {}

примените

from collections import defaultdict

to_write = defaultdict(list)

и затем вместо

        to_write['team1'] = team1
        to_write['team2'] = team2

примените

        to_write['team1'].append(team1)
        to_write['team2'].append(team2)

Объяснение:

Вы не хотите в цикле менять (переписывать) значения ключей, а добавлять их к списку.

При этом возникает проблема: Когда ключ ещё не существовал, его значение не определенно, потому невозможно добавлять к нему - нужно сначала создать пустой список как значение нового ключа.

Преимущества defaultdict:

  1. Не надо контролировать, если ключ в словаре уже существует (чтобы при его отсутствии присвоить ему пустой список), всё делается автоматически.

  2. Иначе работа с ним та же самая, как с обыкновенным словерем.


Примечание:

Когда вам defaultdict не нравится, вы можете то же самое достигнуть применением метода .setdefault() к обыкновенному словарю:

         to_write.setdefault('team1', []).append(team1)
         to_write.setdefault('team2', []).append(team2)
→ Ссылка