728x90
경기데이터드림(공공데이터) - 활용사이트
https://data.gg.go.kr/portal/data/dataset/searchDatasetPage.do
공공데이터api xml응답 예시
<TBGGPETPBAGSTUSM>
<head>
<list_total_count>265</list_total_count>
<RESULT>
<CODE>INFO-000</CODE>
<MESSAGE>정상 처리되었습니다.</MESSAGE>
</RESULT>
<api_version>1.0v</api_version>
</head>
<row>
<FACLT_NM>삼막애견공원</FACLT_NM>
<LOCPLC_LOTNO_ADDR>경기도 안양시 만안구 석수동 18</LOCPLC_LOTNO_ADDR>
<CIRCUMFR_DETAIL_DESC>삼막애견공원 내</CIRCUMFR_DETAIL_DESC>
<MANAGE_DEPT_NM>안양시청</MANAGE_DEPT_NM>
<DATA_STD_DE>2025-03-04</DATA_STD_DE>
</row>
<row>
<FACLT_NM>생태예술공원</FACLT_NM>
<LOCPLC_LOTNO_ADDR>경기도 안양시 만안구 석수동 산24-24</LOCPLC_LOTNO_ADDR>
<CIRCUMFR_DETAIL_DESC>수목원입구</CIRCUMFR_DETAIL_DESC>
<MANAGE_DEPT_NM>안양시청</MANAGE_DEPT_NM>
<DATA_STD_DE>2025-03-04</DATA_STD_DE>
</row>
<row>
<FACLT_NM>삼덕공원</FACLT_NM>
<LOCPLC_LOTNO_ADDR>경기도 안양시 만안구 안양동 782-19</LOCPLC_LOTNO_ADDR>
<CIRCUMFR_DETAIL_DESC>관리소 앞</CIRCUMFR_DETAIL_DESC>
<MANAGE_DEPT_NM>안양시청</MANAGE_DEPT_NM>
<DATA_STD_DE>2025-03-04</DATA_STD_DE>
</row>
</TBGGPETPBAGSTUSM>
row태그별로 데이터들이 담겨있는데 row태그 안의 자식태그는 주제별로 api가 달라 자식태그의 갯수도 명칭도 다르다
xml형식으로 받은 데이터를 자동으로 데이터프레임화 해주는 함수 전체부분
import requests
import pandas as pd
import xml.etree.ElementTree as ET
from bs4 import BeautifulSoup as bs
# url : api에서 요구하는 요청주소
# key : 사용자 계정의 인증키 (해당코드에서는 비공개)
# Type : 호출받을 문서의 타입(초기값 xml형식)
# pSize : 페이지 당 받을 데이터 갯수(row 갯수)
def xmltodf(url, key, Type = 'xml', pIndex = 1, pSize = 100):
headers = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0;Win64; x64)\
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98\
Safari/537.36"
),
}
# 공공데이터api에서 요청주소
target = url +f"?KEY={key}&Type={Type}&pIndex={pIndex}&pSize={pSize}"
# api요청
res = requests.get(target, headers=headers)
root = ET.fromstring(res.text)
# 동적으로 할당되는 변수들의 명칭을 담는 리스트
cols = []
# 동적 변수 할당
for child in root.find('row'):
a = globals()[f'{child.tag}'] = []
cols.append(f'{child.tag}')
# 동적으로 할당된 리스트 변수안에 데이터 적재
for row in root.iter('row'):
for child in row:
globals()[f'{child.tag}'].append(child.text)
# 빈 데이터프레임생성
df = pd.DataFrame()
# 빈 데이터프레임에 동적변수를 컬럼으로 넣고 변수의 데이터 값도 추가
for j in range(0, len(cols)):
df[f'{cols[j]}'] = globals()[f'{cols[j]}']
return df
동적 변수 활용 부분
# 동적으로 할당되는 변수들의 명칭을 담는 리스트
cols = []
처음부터 설계를 row태그의 자식 태그명으로 변수를 선언하기 위해 동적으로 생성될 변수명을 담을 리스트 변수 cols 선언
# 동적 변수 할당
for child in root.find('row'):
a = globals()[f'{child.tag}'] = []
cols.append(f'{child.tag}')
호출받은 xml문서에서 데이터가 row태그 단위로 나열되어 있고 우선 데이터상 컬럼(열)로 삼을 변수를 선정을 위해 find()함수로 첫번째 row태그 선택후 row태그의 자식태그들을 child변수에 담아 반복문을 통해 순서대로 활용. globals()함수를 활용해 동적 리스크변수 선언(변수명은 row태그의 자식태그명으로), 선언후 변수명을 cols리스크에 할당
# 동적으로 할당된 리스트 변수안에 데이터 적재
for row in root.iter('row'):
for child in row:
globals()[f'{child.tag}'].append(child.text)
선언된 동적 리스크변수 안에 xml태그 안의 데이터값을 할당
데이터프레임화
# 빈 데이터프레임생성
df = pd.DataFrame()
# 빈 데이터프레임에 동적변수를 컬럼으로 넣고 변수의 데이터 값도 추가
for j in range(0, len(cols)):
df[f'{cols[j]}'] = globals()[f'{cols[j]}']
동적으로 생성된 변수를 바로 넣어 데이터프레임화 할수 없기 떄문에 빈데이터프레임을 우선 생성후 컬럼단위로 빈데이터프레임에 할당
728x90
'개발공부 > 생성형 AI 기반 개발자 과정' 카테고리의 다른 글
| 주소록 관리 (0) | 2025.04.28 |
|---|---|
| 크롤링 활용(selenium 활용) (0) | 2025.04.17 |
| pandas - 7 (0) | 2025.04.06 |
| pandas - 6 (0) | 2025.04.06 |
| pandas - 5 (0) | 2025.04.06 |