Почему возникает ошибка Traceback (most recent call last) при попытке сохранить словарь JSON в переменной?

Как избежать ошибки "Traceback (most recent call last)" при попытке сохранить JSON файл "news_dict.json" в переменную "news_dict" в Python с использованием BeautifulSoup и requests?
  • 20 июля 2024 г. 16:22
Ответы на вопрос 2
Ошибка "Traceback (most recent call last)" в Python обычно возникает, когда в коде происходит исключение или ошибка. В данном случае, возможно, ошибка возникает из-за неправильного формата данных в переменной при попытке сохранить словарь JSON.

Чтобы избежать этой ошибки при сохранении JSON файла в переменную, вы можете обернуть код в блок try-except. Это позволит обработать исключение и избежать завершения программы из-за ошибки. Пример:

```python
import json
from bs4 import BeautifulSoup
import requests

try:
    # Получение данных
    response = requests.get("https://example.com")
    soup = BeautifulSoup(response.text, "html.parser")
    
    # Формирование словаря с новостными заголовками
    news_dict = {}
    for idx, title in enumerate(soup.find_all("h2")):
        news_dict[idx] = title.text
    
    # Сохранение словаря в JSON файл
    with open("news_dict.json", "w") as f:
        json.dump(news_dict, f)

except Exception as e:
    print(f"Произошла ошибка: {e}")
```

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

Также важно убедиться, что данные, которые вы пытаетесь сохранить в JSON формате, соответствуют требованиям для сериализации в JSON. Например, словарь должен содержать только сериализуемые типы данных (строки, числа, списки, словари), иначе это может вызвать ошибку при попытке сохранения в JSON формате.
Читаем и осознаём текст ошибки. UnicodeDecodeError - ошибка декодирования строки байт в юникод-строку, т.е. косяк с кодировками. В списке traceback ищем последний элемент, который ссылается на твой код. 
File "C:\Users\Maks\PycharmProjects\pythonProject7\main.py", line 57, in check_news_update
    news_dict = json.load(file)

Т.е. косяк при чтении json из файла. При вызове load() кодировку нельзя указать, так что проверяем, откуда приходит файл.
with open('news_dict.json') as file:  # где encoding? где режим открытия?
        news_dict = json.load(file)

Вот и ошибка - не указана кодировка (и я бы явно указал режим открытия 'rt'). Причём при сохранении не забыл ведь указать...
with open("news_dict.json", "w",encoding="utf-8") as file:  # а тут всё правильно
            json.dump(news_dict, file, indent=4, ensure_ascii=False)
Похожие вопросы