Руководство по парсингу 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 комментариев