Como analisar XML em Python

Comentários: 0

XML, ou eXtensible Markup Language, é uma linguagem de marcação versátil, normalmente utilizada para codificar documentos num formato legível por humanos e por máquinas. Este formato é amplamente utilizado na transferência de dados, na criação de ficheiros de configuração e no desenvolvimento de serviços Web.

Nos documentos XML, os elementos são encapsulados em etiquetas que indicam o início e o fim de cada elemento, fornecendo uma estrutura clara para os dados.

Exemplo de XML:

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

Este artigo explora diferentes bibliotecas e métodos disponíveis para analisar XML em Python.

Bibliotecas Python para análise de XML

A seguir, vamos nos aprofundar nas várias bibliotecas disponíveis para extração de dados XML em Python e guiá-lo pelo processo de instalação para configurar seu ambiente para trabalhar com documentos XML.

xml.etree.ElementTree

xml.etree.ElementTree é um módulo de biblioteca padrão para analisar e criar dados XML. Ele fornece uma API eficiente e direta para analisar XML a partir de strings e arquivos e para criar documentos XML.

Exemplo básico:


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}')

Saída:

1.png

xml.dom.minidom

xml.dom.minidom é outra biblioteca Python incorporada que fornece uma representação DOM (Document Object Model) de XML. Esta biblioteca permite uma manipulação XML mais detalhada.

Exemplo básico:

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}')

Saída:

2.png

Análise de XML do BeautifulSoup

BeautifulSoup é uma biblioteca popular para analisar documentos HTML e XML. É particularmente útil para raspar dados da web e lidar com XML mal formado.

Exemplo básico:


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}')

Saída:

3.png

Biblioteca lxml

A lxml é uma biblioteca poderosa que combina a facilidade de utilização da ElementTree com a velocidade e as funcionalidades da biblioteca libxml2. Ela suporta a análise de XML e HTML.

Exemplo básico:

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}')

Saída:

4.png

Conversão de XML para dicionário

A conversão de XML para um dicionário pode ser útil para manipular e processar dados XML com mais flexibilidade.


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)

Saída:

5.png

Conversão de XML para CSV

A conversão de dados do formato XML para CSV simplifica o processo de análise e armazenamento de dados, facilitando a integração com aplicações de folha de cálculo e melhorando a capacidade de visualizar os dados de forma eficaz.

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])

Tratamento de erros XML

Ao analisar XML, o tratamento de erros é crucial para garantir que seu código possa gerenciar dados inesperados ou malformados graciosamente.

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}')

Compactando XML a partir de um URL

Aqui está um exemplo prático usando BeautifulSoup para analisar dados XML de uma URL:

import requests  # Importar a biblioteca requests para efetuar pedidos HTTP
from bs4 import BeautifulSoup  # Importando BeautifulSoup da biblioteca bs4 para analisar XML

# Definir o URL dos dados XML
url = "https://httpbin.org/xml"

# Enviar um pedido GET para o URL
response = requests.get(url)

# Analisar o conteúdo XML da resposta utilizando BeautifulSoup
soup = BeautifulSoup(response.content, 'xml')

# Percorrer todos os elementos "slide" no XML
for slide in soup.find_all('slide'):
    # Localizar o elemento "título" em cada "diapositivo" e obter o respetivo texto
    title = slide.find('title').text
    # Imprimir o texto do título
    print(f'Title: {title}')

Saída:

6 (1).png

Várias aplicações utilizam o formato de dados elementar XML, desde serviços Web a ficheiros de configuração. Python dispõe de numerosas bibliotecas robustas para a análise e a manipulação de dados XML. Python dispõe de uma biblioteca completa para a análise de dados XML, quer se trate de extração básica de dados ou de processamento elaborado de documentos. A capacidade obrigatória dos programadores web Python é codificar XML tanto para o intercâmbio de dados como para a raspagem da Web.

Comentários:

0 Comentários