파이썬에서 XML을 구문 분석하는 방법

댓글: 0

XML, 즉 확장 가능한 마크업 언어는 사람이 읽을 수 있고 기계가 읽을 수 있는 형식으로 문서를 인코딩하는 데 일반적으로 사용되는 다목적 마크업 언어입니다. 이 형식은 데이터 전송, 구성 파일 생성, 웹 서비스 개발에 광범위하게 활용됩니다.

XML 문서에서 요소는 각 요소의 시작과 끝을 나타내는 태그 안에 캡슐화되어 데이터의 명확한 구조를 제공합니다.

XML의 예:

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

이 문서에서는 Python에서 XML을 구문 분석하는 데 사용할 수 있는 다양한 라이브러리와 메서드를 살펴봅니다.

XML 구문 분석을 위한 Python 라이브러리

다음으로, Python에서 XML 데이터 추출에 사용할 수 있는 다양한 라이브러리를 살펴보고, 설치 과정을 안내하여 XML 문서 작업을 위한 환경을 설정합니다.

xml.etree.ElementTree

xml.etree.ElementTree는 XML 데이터를 파싱하고 생성하기 위한 표준 라이브러리 모듈입니다. 이 모듈은 문자열과 파일에서 XML을 구문 분석하고 XML 문서를 생성하기 위한 효율적이고 간단한 API를 제공합니다.

기본 예제:


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은 XML의 DOM(문서 객체 모델) 표현을 제공하는 또 다른 기본 제공 Python 라이브러리입니다. 이 라이브러리를 사용하면 더 자세한 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 구문 분석

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

URL에서 XML 구문 분석하기

다음은 URL에서 XML 데이터를 구문 분석하기 위해 BeautifulSoup을 사용하는 실제 예제입니다:

import requests  # 요청 라이브러리를 가져와서 HTTP 요청하기
from bs4 import BeautifulSoup  # XML 구문 분석을 위해 bs4 라이브러리에서 BeautifulSoup 가져오기

# XML 데이터의 URL 정의
url = "https://httpbin.org/xml"

# URL로 GET 요청 보내기
response = requests.get(url)

# BeautifulSoup을 사용하여 응답의 XML 콘텐츠를 구문 분석합니다.
soup = BeautifulSoup(response.content, 'xml')

# XML의 모든 '슬라이드' 요소를 반복합니다.
for slide in soup.find_all('slide'):
    # 각 '슬라이드' 내에서 '제목' 요소를 찾아 해당 텍스트를 가져옵니다.
    title = slide.find('title').text
    # 제목 텍스트 인쇄
    print(f'Title: {title}')

출력:

6 (1).png

웹 서비스부터 구성 파일에 이르기까지 다양한 애플리케이션에서 기본 데이터 형식인 XML을 사용합니다. Python은 XML 데이터 구문 분석과 조작을 위한 수많은 강력한 라이브러리를 제공합니다. Python은 기본적인 데이터 마이닝부터 정교한 문서 처리까지 XML 데이터 구문 분석을 위한 포괄적인 라이브러리를 갖추고 있습니다. Python 웹 개발자에게는 데이터 교환과 웹 스크래핑을 위해 XML을 코딩하는 것이 필수 능력입니다.

댓글:

0 댓글