Объясните, пожалуйста, почему выводится только один элемент
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 шт):
Вместо
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:
Не надо контролировать, если ключ в словаре уже существует (чтобы при его отсутствии присвоить ему пустой список), всё делается автоматически.
Иначе работа с ним та же самая, как с обыкновенным словерем.
Примечание:
Когда вам defaultdict не нравится, вы можете то же самое достигнуть применением метода .setdefault() к обыкновенному словарю:
to_write.setdefault('team1', []).append(team1)
to_write.setdefault('team2', []).append(team2)