Посібник із парсингу XML у Python

Коментарі: 0

XML, або eXtensible Markup Language (розширювана мова розмітки), широко використовується для кодування документів. У той час як HTML слугує для візуального подання інформації, XML орієнтований на структурування та акцентування змісту даних. Цей формат часто застосовується для передачі даних, створення файлів конфігурації та веб-сервісів.

Елементи в документах XML розміщуються всередині тегів, які позначають початок і кінець кожного елемента.

Приклад XML:

<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
      </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>

У цій статті ми розглянемо різні бібліотеки та методи парсингу XML у Python.

Бібліотеки Python для парсингу XML

Нижче представлено докладніше необхідні бібліотеки та процес їхнього встановлення для вилучення даних з XML.

xml.etree.ElementTree

xml.etree.ElementTree - стандартна бібліотека Python для парсингу та створення XML-даних. Вона пропонує простий і ефективний API для обробки XML з рядків і файлів, а також для генерації XML-документів.

Приклад використання:


import xml.etree.ElementTree as ET

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = ET.fromstring(xml_data)

for item in root.findall('item'):
    name = item.find('name').text
    price = item.find('price').text
    print(f'Name: {name}, Price: {price}')

Результати виводу:

1.png

xml.dom.minidom

xml.dom.minidom - вбудована бібліотека Python, що представляє XML-дані у формі DOM (Document Object Model). Ця бібліотека забезпечує більш детальні можливості маніпуляцій з XML-документами.

Приклад використання:

from xml.dom.minidom import parseString

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

dom = parseString(xml_data)
items = dom.getElementsByTagName('item')

for item in items:
    name = item.getElementsByTagName('name')[0].firstChild.data
    price = item.getElementsByTagName('price')[0].firstChild.data
    print(f'Name: {name}, Price: {price}')

Результати виводу:

2.png

BeautifulSoup XML parsing

BeautifulSoup - широко відома бібліотека для парсингу HTML і XML документів. Вона особливо зручна для веб-скрапінгу та обробки некоректно структурованого XML.

Приклад використання:


from bs4 import BeautifulSoup

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

soup = BeautifulSoup(xml_data, 'xml')
items = soup.find_all('item')

for item in items:
    name = item.find('name').text
    price = item.find('price').text
    print(f'Name: {name}, Price: {price}')

Результати виводу:

3.png

lxml library

lxml - просунута бібліотека, яка поєднує простоту використання ElementTree з високою швидкістю і розширеними можливостями бібліотеки libxml2. Вона підтримує парсинг як XML, так і HTML.

Приклад використання:

from lxml import etree

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = etree.fromstring(xml_data)
items = root.findall('item')

for item in items:
    name = item.find('name').text
    price = item.find('price').text
    print(f'Name: {name}, Price: {price}')

Результати виводу:

4.png

Перетворення XML у словник

Конвертація XML у словник спрощує маніпуляцію й оброблення даних XML, роблячи їх більш гнучкими для використання.


import xml.etree.ElementTree as ET

def xml_to_dict(element):
    if len(element) == 0:
        return element.text
    return {child.tag: xml_to_dict(child) for child in element}

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = ET.fromstring(xml_data)
data_dict = xml_to_dict(root)
print(data_dict)

Результати виведення:

5.png

Конвертація XML у CSV

Конвертація даних з XML у формат CSV може бути корисною для аналізу та зберігання даних. Це спрощує інтеграцію з табличними додатками та полегшує візуалізацію даних.

import csv
import xml.etree.ElementTree as ET

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = ET.fromstring(xml_data)

with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Name', 'Price'])
    
    for item in root.findall('item'):
        name = item.find('name').text
        price = item.find('price').text
        writer.writerow([name, price])

Обробка помилок під час парсингу XML

Під час роботи з XML вкрай важливо вміти обробляти помилки, щоб код міг адекватно обробляти несподівані або некоректні дані

import xml.etree.ElementTree as ET

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

try:
    root = ET.fromstring(xml_data)
except ET.ParseError as e:
    print(f'Error parsing XML: {e}')

Парсинг XML з URL з використанням BeautifulSoup

Ось приклад того, як можна використовувати бібліотеку BeautifulSoup для парсингу даних XML, отриманих з URL:

import requests  # Імпортуємо бібліотеку requests для виконання HTTP-запитів
from bs4 import BeautifulSoup  # Імпортуємо BeautifulSoup з бібліотеки bs4 для парсингу XML

# Визначаємо URL XML даних
url = "https://httpbin.org/xml"

# Відправляємо GET-запит на URL
response = requests.get(url)

# Парсимо XML вміст відповіді за допомогою BeautifulSoup
soup = BeautifulSoup(response.content, 'xml')

# Проходимо по всіх елементах 'slide' в XML
for slide in soup.find_all('slide'):
    # Знаходимо елемент 'title' у кожному 'slide' і отримуємо його текст
    title = slide.find('title').text
    # Виводимо текст заголовка
    print(f'Title: {title}')

Результати виводу:

6 (1).png

Python надає широкі можливості для парсингу та обробки даних у форматі XML завдяки безлічі потужних бібліотек, що робить його придатним як для базового аналізу даних, так і для складної обробки документів. Освоєння цих інструментів є критично важливою навичкою для веб-розробників на Python.

Коментарії:

0 Коментаріїв