파이썬의 requests 라이브러리와 예외 처리로 서버와의 안정적인 연결 통로를 뚫었다면, 이제 통로를 통해 들어오는 '데이터 알맹이'를 해체할 시간입니다. 공공데이터 서버에서 데이터를 받아와 response.text로 화면에 출력해 보면, 알 수 없는 괄호와 기호들이 빽빽하게 뒤섞인 텍스트 무덤을 마주하게 됩니다.
이 무덤 속에서 내가 진짜 필요한 '오늘의 기온'이나 '버스 도착 시간' 같은 정보만 쏙쏙 골라내어 파이썬 변수에 담는 과정을 '파싱(Parsing, 데이터 구문 분석)'이라고 합니다. 오픈 API가 데이터를 건네줄 때 사용하는 양식은 크게 JSON과 XML 두 가지로 나뉩니다. 오늘은 이 두 포맷의 결정적인 차이점을 알아보고, 실무에서 바로 써먹는 파이썬 파싱 핵심 코드를 깔끔하게 정리해 드리겠습니다.
JSON과 XML, 도대체 구조가 어떻게 다를까?
데이터를 파싱하려면 먼저 상대방이 어떤 규칙으로 글을 썼는지 이해해야 합니다. 두 포맷은 정보를 저장하고 전달한다는 목적은 같지만, 생김새와 철학이 완전히 다릅니다.
1) XML (Extensible Markup Language)
XML은 우리가 흔히 보는 HTML 웹페이지와 사촌 관계입니다. 데이터 앞뒤를 <태그>와 </태그>로 감싸서 정보의 의미를 정의합니다. 예를 들어 기온 데이터를 표현할 때 <temperature>25</temperature>와 같은 형태로 씁니다.
과거부터 정부 기관이나 대기업 시스템에서 표준으로 널리 사용해 왔기 때문에, 오래된 공공데이터 API일수록 XML 형태로만 데이터를 제공하는 경우가 많습니다. 구조가 명확하고 튼튼하다는 장점이 있지만, 태그 이름이 중복으로 들어가다 보니 데이터 용량이 커지고 사람이 읽기에 조금 복잡하다는 단점이 있습니다.
2) JSON (JavaScript Object Notation)
JSON은 현대 웹과 앱 개발에서 가장 사랑받는 데이터 포맷입니다. 파이썬의 사전(Dictionary) 자료형과 똑같이 중괄호 {}를 사용하고 키(Key): 값(Value) 형태로 데이터를 저장합니다.
앞서 본 기온 데이터를 JSON으로 바꾸면 {"temperature": 25}로 아주 단순해집니다. 불필요한 태그가 없어서 데이터 크기가 압도적으로 작고, 파이썬 코드와 궁합이 너무 좋아서 눈으로 슬쩍 봐도 구조를 파악하기 쉽습니다. 최근에 만들어지는 오픈 API들은 대부분 JSON을 기본으로 채택하고 있습니다.
파이썬으로 JSON 데이터 파싱하기 (난이도: 하)
JSON은 파이썬과 찰떡궁합입니다. 내장된 json 라이브러리를 쓰거나 requests가 제공하는 .json() 함수를 호출하면, 복잡한 텍스트가 순식간에 파이썬 딕셔너리와 리스트로 알아서 변환됩니다. 중괄호는 딕셔너리로, 대괄호 []는 리스트로 1:1 매칭된다는 점만 기억하면 됩니다.
import requests
# JSON 데이터를 반환하는 샘플 주소와 파라미터 (예시용 구조)
url = "http://apis.data.go.kr/example_json_api"
params = {'dataType': 'JSON', 'serviceKey': 'YOUR_KEY'}
response = requests.get(url, params=params)
data = response.json() # 이 한 줄로 텍스트가 파이썬 딕셔너리로 변환됩니다.
# 데이터가 겹겹이 쌓여있는 경우 계층을 따라 들어가며 추출합니다.
# 구조 예시: {"response": {"body": {"items": [{"title": "날씨 정보", "value": "맑음"}]}}}
try:
item_list = data['response']['body']['items']
for item in item_list:
print(f"항목명: {item['title']}, 값: {item['value']}")
except KeyError as e:
print(f"데이터 구조가 변경되었거나 키를 찾을 수 없습니다: {e}")
파이썬으로 XML 데이터 파싱하기 (난이도: 중)
만약 내가 원하는 공공데이터가 JSON을 지원하지 않고 오직 XML로만 나온다면 어떻게 해야 할까요? 파이썬 사전형태로 바꿀 수 없기 때문에, 이때는 XML의 뼈대를 추적해 주는 도구가 필요합니다. 파이썬 내장 라이브러리인 xml.etree.ElementTree를 쓰거나, 시각적으로 더 직관적인 외부 라이브러리 BeautifulSoup를 활용하는 것이 편리합니다. 여기서는 초보자도 이해하기 쉬운 BeautifulSoup(lxml 파서 활용) 방식을 소개합니다.
# 내 컴퓨터 터미널에 pip install beautifulsoup4 lxml 을 먼저 설치해야 합니다.
from bs4 import BeautifulSoup
import requests
url = "http://apis.data.go.kr/example_xml_api"
params = {'dataType': 'XML', 'serviceKey': 'YOUR_KEY'}
response = requests.get(url, params=params)
# BeautifulSoup에게 XML 데이터를 전달하고 파싱 준비를 시킵니다.
soup = BeautifulSoup(response.text, 'xml')
# <item> 태그들을 모두 찾아내어 리스트로 만듭니다.
items = soup.find_all('item')
for item in items:
# <item> 태그 내부에 있는 <title>과 <value> 태그의 알맹이(.text)를 가져옵니다.
title = item.find('title').text if item.find('title') else "없음"
value = item.find('value').text if item.find('value') else "없음"
print(f"항목명: {title}, 값: {value}")
데이터 수집을 시작하기 전에 꼭 해야 하는 '구조 파악'
많은 분들이 API 연동을 시작할 때 코드부터 무작정 짜기 시작합니다. 그러면 백 퍼센트 엉뚱한 곳에서 에러를 만납니다.
코드를 작성하기 전에, API 제공 기관이 배포한 '오픈 API 활용 가이드(HWP나 PDF 파일)'를 열어서 데이터 응답 예시를 눈으로 먼저 확인해야 합니다. 만약 문서가 부실하다면 파이썬으로 print(response.text)를 먼저 실행해서 출력된 결과물을 웹 브라우저나 JSON 뷰어(Json Viewer) 사이트에 붙여넣고 데이터가 몇 겹으로 둘러싸여 있는지 층수를 세어보는 습관을 지녀야 합니다. 첫 번째 문을 열면 response, 그 안에 body, 그 안에 items가 들어있는 식의 층수 구조를 확실히 이해하고 코드를 짜야 엉뚱한 곳을 파고드는 삽질을 막을 수 있습니다.
핵심 요약
오픈 API의 데이터 양식은 크게 고전적인 XML과 직관적인 JSON으로 나뉩니다.
JSON 데이터는 requests의
response.json()을 사용하여 파이썬 딕셔너리로 매우 쉽게 변환할 수 있습니다.XML 데이터는 파이썬 사전형 구조로 바로 읽을 수 없으므로
BeautifulSoup같은 라이브러리를 활용해 태그 단위로 알맹이를 추출해야 합니다.
0 댓글