Парсинг с помощью JSON в Python

Комментарии: 0

JSON — формат данных JavaScript Object Notation, который отличается легкостью и доступностью для чтения и записи. Освоение работы с JSON необходимо при использовании данных из API, файлов настроек или других источников. В этой статье мы рассмотрим ключевые методы работы с JSON с помощью модуля json в Python.

JSON и его структура

JSON организует данные в формате ключ-значение, похожем на словари в Python. Рассмотрим базовый пример JSON-объекта:

{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"]
}

В этом примере JSON содержит строку, число, булево значение и массив. Знание этих элементов структуры критически важно для эффективного парсинга и работы с JSON-данными в Python.

Использование модуля JSON в Python

Модуль JSON предлагает методы типа json.loads(), который позволяет читать JSON из строки, и json.load(), применяемый для чтения JSON из файла. Для записи данных в формате JSON используются методы json.dumps() и json.dump(), которые позволяют соответственно записывать JSON в строку и файл.

Чтение данных JSON

Существует несколько способов чтения данных JSON, которые мы рассмотрим далее:

Чтение JSON из строки

Для чтения данных JSON из строки используйте метод json.loads():

import json

json_string = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_string)

print(data)

Вывод:

1.png

Чтение JSON из файла

Для чтения данных JSON из файла используйте метод json.load():

import json

with open('data.json', 'r') as file:
    data = json.load(file)

print(data)

Вывод:

2.png

Запись данных JSON

Ниже представлены различные способы записать данные JSON:

Запись JSON в строку

Для записи данных JSON в строку используйте метод json.dumps():

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

json_string = json.dumps(data)
print(json_string)

Вывод:

3.png

Запись JSON в файл

Для записи данных JSON в файл используйте метод json.dump():

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

with open('data.json', 'w') as file:
    json.dump(data, file)

Обработка вложенного JSON

Вложенные объекты JSON часто встречаются при работе с более сложными структурами данных. Python легко справляется с этими вложенными структурами.

import json

nested_json_string = '''
{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"],
    "address": {
        "street": "123 Main St",
        "city": "Wonderland"
    }
}
'''

data = json.loads(nested_json_string)
print(data['address']['city'])

Вывод:

4.png

Настраиваемый JSON-кодировщик

Иногда необходимо преобразовать настраиваемые объекты Python в JSON, что требует настраиваемого кодировщика.

import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

class StudentEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Student):
            return obj.__dict__
        return super().default(obj)

student = Student("Alice", 30, False)
json_string = json.dumps(student, cls=StudentEncoder)
print(json_string)

Вывод:

5.png

Настраиваемый JSON-декодер

Аналогично, для декодирования данных JSON в настраиваемые объекты Python, вам понадобится настраиваемый декодер.

import json

class Student:
    def __init__(self, name, age, is_student):
        self.name = name
        self.age = age
        self.is_student = is_student

def student_decoder(dct):
    return Student(dct['name'], dct['age'], dct['is_student'])

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
student = json.loads(json_string, object_hook=student_decoder)
print(student.name)

Вывод:

6.png

Обработка распространенных ошибок

Далее представлены наиболее распространенные ошибки при работе с JSON.

Недопустимый формат JSON

Распространенная ошибка при анализе JSON — это недопустимый формат JSON. JSON требует двойных кавычек вокруг ключей и строковых значений, а также правильного вложения скобок и фигурных скоб.

import json

invalid_json_string = "{'name': 'Alice', 'age': 30, 'is_student': False}"
try:
    data = json.loads(invalid_json_string)
except json.JSONDecodeError as e:
    print(f"Invalid JSON format: {e}")

Вывод:

7.png

Обработка отсутствующих ключей

При анализе данных JSON вы можете столкнуться с отсутствующими ключами. Используйте метод get для предоставления значения по умолчанию, если ключ отсутствует.

import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)import json

json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)

is_student = data.get('is_student', False)
print(is_student)

Отладка проблем с анализом JSON

Используйте модуль pdb для установки точек останова и отладки вашего кода парсинга JSON.

import json
import pdb

json_string = '{"name": "Alice", "age": 30, "is_student": false}'
pdb.set_trace()
data = json.loads(json_string)
print(data)

Пример использования JSON в веб-скрапинге

Веб-скрапинг часто связан с извлечением данных из веб-API, возвращающих информацию в формате JSON. Рассмотрим пример работы с библиотекой requests и API Httpbin.

Перед началом установите библиотеку requests:

pip install requests

Пример кода ниже демонстрирует, как отправить GET-запрос к указанному URL с помощью функции requests.get(url) и обработать полученный JSON-ответ с помощью метода response.json(), преобразовав его в словарь Python. Далее, программа извлекает и выводит специфические данные, такие как заголовки, информацию о пользовательском агенте, источник и URL.

Этот пример также включает обработку исключений для устойчивости кода: он перехватывает json.JSONDecodeError при ошибках декодирования JSON и KeyError при отсутствии определённых ключей. Такой подход предотвращает сбои программы из-за некорректных данных, что делает код более надежным для реальных задач веб-скрапинга.

import requests
import json

url = 'https://httpbin.org/anything'

response = requests.get(url)

try:
    data = response.json()

    # Извлечение конкретных данных из JSON-ответа
    headers = data['headers']
    user_agent = headers.get('User-Agent', 'N/A')
    origin = data.get('origin', 'N/A')
    url = data.get('url', 'N/A')

    print(f"User Agent: {user_agent}")
    print(f"Origin: {origin}")
    print(f"URL: {url}")

except json.JSONDecodeError:
    print("Error decoding JSON response")

except KeyError as e:
    print(f"Key error: {e} not found in the JSON response")

8.png

Используя модуль json и описанные практики вы сможете эффективно собирать, анализировать, записывать и отлаживать JSON-данные. Это включает регулярное тестирование кода, применение подходящих инструментов и использование передовых функций Python для совершенствования ваших умений в работе с JSON.

Это особенно важно при веб-скрапинге, так как данные из веб-API обычно предоставляются именно в JSON формате. Навыки эффективного извлечения и манипулирования JSON-данными позволяют успешно обрабатывать информацию из разнообразных веб-источников.

Комментарии:

0 комментариев