Парсинг за допомогою 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 Коментаріїв