Cómo analizar XML en Python

Comentarios: 0

XML, o eXtensible Markup Language, es un lenguaje de marcado versátil que se utiliza habitualmente para codificar documentos en un formato legible tanto por humanos como por máquinas. Este formato se utiliza ampliamente para transferir datos, crear archivos de configuración y desarrollar servicios web.

En los documentos XML, los elementos se encapsulan dentro de etiquetas que señalan el principio y el final de cada elemento, proporcionando una estructura clara para los datos.

Ejemplo de XML:

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

Este artículo explora diferentes librerías y métodos disponibles para parsear XML en Python.

Librerías Python para el análisis sintáctico de XML

A continuación, profundizaremos en las distintas librerías disponibles para la extracción de datos XML en Python, y te guiaremos en el proceso de instalación para configurar tu entorno de trabajo con documentos XML.

xml.etree.ElementTree

xml.etree.ElementTree es un módulo de biblioteca estándar para analizar y crear datos XML. Proporciona una API eficiente y directa para analizar XML a partir de cadenas y archivos y para crear documentos XML.

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

Salida:

1.png

xml.dom.minidom

xml.dom.minidom es otra librería incorporada en Python que proporciona una representación DOM (Document Object Model) de XML. Esta biblioteca permite una manipulación más detallada de XML.

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

Salida:

2.png

Parametrización XML de BeautifulSoup

BeautifulSoup es una biblioteca popular para analizar documentos HTML y XML. Es particularmente útil para el raspado de datos web y el manejo de XML mal formados.

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

Salida:

3.png

biblioteca lxml

lxml es una potente librería que combina la facilidad de uso de ElementTree con la velocidad y características de la librería libxml2. Soporta el análisis sintáctico tanto de XML como de HTML.

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

Salida:

4.png

Conversión de XML a diccionario

La conversión de XML a diccionario puede ser útil para manipular y procesar datos XML con mayor flexibilidad.


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)

Salida:

5.png

Conversión de XML a CSV

La conversión de datos de formato XML a CSV simplifica el proceso de análisis y almacenamiento de datos, facilitando su integración con aplicaciones de hojas de cálculo y mejorando la capacidad de visualizar los datos 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])

Manejo de errores XML

Cuando se analiza XML, el manejo de errores es crucial para asegurar que su código puede manejar datos inesperados o malformados con gracia.

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

Parar XML desde una URL

He aquí un ejemplo práctico usando BeautifulSoup para parsear datos XML desde una URL:

import requests  # Importación de la biblioteca requests para realizar peticiones HTTP
from bs4 import BeautifulSoup  # Importación de BeautifulSoup de la biblioteca bs4 para el análisis sintáctico de XML

# Definir la URL de los datos XML
url = "https://httpbin.org/xml"

# Enviar una solicitud GET a la URL
response = requests.get(url)

# Analizar el contenido XML de la respuesta utilizando BeautifulSoup
soup = BeautifulSoup(response.content, 'xml')

# Recorrer todos los elementos 'slide' del XML
for slide in soup.find_all('slide'):
    # Busca el elemento 'title' dentro de cada 'slide' y obtén su texto
    title = slide.find('title').text
    # Imprimir el texto del título
    print(f'Title: {title}')

Salida:

6 (1).png

Diversas aplicaciones utilizan el formato de datos elemental XML, desde servicios web hasta archivos de configuración. Python cuenta con numerosas bibliotecas robustas para el análisis sintáctico y la manipulación de datos XML. Python dispone de una completa biblioteca para el análisis sintáctico de datos XML, tanto si se trata de minería de datos básicos como de procesamiento de documentos elaborados. La habilidad imprescindible de los desarrolladores web con Python es codificar XML tanto para el intercambio de datos como para el web scraping.

Comentarios:

0 Comentarios