내가 배우는 이야기

[파이썬독학] API - 1. XML, JSON 파이썬에서 활용하기 본문

로봇화/PYTHON 파이썬

[파이썬독학] API - 1. XML, JSON 파이썬에서 활용하기

깨끗한눈빛 2018. 4. 15. 18:08

< 파이썬 독학하기 - API >

이번 프로젝트에서 API를 가져다 써야했는데 기본개념이 정리가 안 돼서 많이 헤맸다.

여러 문서들과 인터넷을 떠돌며 배운 개념들을 정리해보려고 한다.


웹에서 데이터를 끌어다 쓸 때에는 XML(eXtensible Markup Language)과 JSON(JavaScript Object Notation) 포맷을 사용한다.

xml은 왠지 이름에서 느껴지듯 Html과 비슷한 구조로 되어있는 문서로, 상대적으로 보기 쉬운 구조를 갖고 있다. JSON은 파이썬의 리스트, 딕셔너리 형과 매우 비슷하고 형태가 간단하다. 

먼저 XML과 JSON을 차례로 살펴보고 Open API를 파이썬에서 활용하는 방법을 다루어보겠다.


1. XML 활용 기초

[1] XML 문서의 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<response>
    <users>
        <user x = '1'>
            <id>1</id>
            <name>You</name>
            <nation>Korea</nation>
        </user>
        <user x = '2'>
            <id>2</id>
            <name>John</name>
            <nation>UK</nation>
        </user>
    </users>
</response>

cs

HTML파일이 <html>안에 <head></head>, <body></body>가 있고 </html>로 닫아주는 것 처럼 XML은 HTML과 비슷한 느낌이 난다.


[2] XML 파싱 및 활용

파싱 후 파이썬의 [] (인덱스 연산자)를 사용해 데이터를 추출할 수 있다.

<예제 1>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# ex1_xml.py
 
import xml.etree.ElementTree as ET
 
data ='''
<nation>
  <name>Korea</name>
  <capital>Seoul</capital>
  <code type="intl">
     +82
   </code>
   <info hide="yes"/>
</nation>'''
 
tree = ET.fromstring(data)
print('Name: ', tree.find('name').text)
print('Capital city: ', tree.find('capital').text)
print('Code: ', tree.find('code').text)
print('Others: ', tree.find('info').get('hide'))
cs

: XML형태의 데이터를 파싱. 파싱한 데이터에서 이름, 수도, 국가코드에 해당하는 값을 찾아 출력하는 코드이다.

<결과화면>

fromstring()

: 문자열에서 Element로 XML을 파싱
: XML 데이터를 꺼내쓰려면 트리 형태여야한다. fromstring()이 트리로 변환시켜준다.


find()

: XML 트리를 돌면서 값을 찾아준다.
: 각 노드는 텍스트나, hide같은 속성 그리고 자식 노드를 가질 수 있다.



<예제 2>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ex2_xml.py
 
import xml.etree.ElementTree as ET
 
input = '''
<world>
    <nations>
        <nation x = '1'>
            <id>001</id>
            <name>Korea</name>
            <capital>Seoul</capital>
        </nation>
        <nation x = '2'>
            <id>002</id>
            <name>Taiwan</name>
            <capital>Taipei</capital>
        </nation>
    </nations>
</world>'''
 
stuff = ET.fromstring(input) # XML을 읽을 수 있게 트리형태로 변환
lst = stuff.findall('nations/nation'# XML트리에서 nations/nation안의 subtrees를 불러온다
print('The number of nations:'len(lst)) # nation이 몇 개인지 출력
 
# nation 노드를 하나하나 돌리면서 name, id, capital을 출력하고 nation노드에서 속성 x를 출력 
for item in lst: 
    print('Name', item.find('name').text)
    print('Id', item.find('id').text)
    print('Capital city', item.find('capital').text)
    print('Attribute', item.get("x"))
cs

예제 1과 비슷하나 이번에는 국가 노드가 한 개가 아니라 여러 개 일 경우이다. for문으로 노드를 돌리면서 출력한다.


<결과화면>


2. JSON 활용 기초

[1] JSON 문서의 예

1
2
3
{"name" : "Korea", "capital" : "Seoul", 
 "code" : {"type" : "intl", "number" : "+82"},
 "info" : {"hide" : "yes"}}
cs

파이썬의 딕셔너리처럼 키와 값이 들어있다.


[2] JSON 파싱 및 활용


<예제 1>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import json
 
data = '''
[
    { "id" : "001",
    "x" : "1",
    "name" : "Korea",
    "capital" : "Seoul"
    },
    { "id" : "002",
    "x" : "2",
    "name" : "Taiwan",
    "capital" : "Taipei"
    }
]'''
 
info = json.loads(data)
print('User count:'len(info))
 
for item in info:
    print('Name: ', item['name'])
    print('Id: ', item['id'])
    print('Capital city: ', item['capital'])
    print('Attribute: ', item['x'])
 
cs


<결과화면>
: XML 예제2번과 동일한 결과를 얻는다.

json.loads(data)

: JSON 문서를 리스트/딕셔너리 형으로 불러들인다.



데이터를 파싱하고 추출하는 코드는 JSON을 사용했을 때 더 간결하고 직관적이다. 간결함 때문에 요즘은 JSON을 사용하는 추세라고 한다.

다음 단계는 XML이나 JSON을 사용해서 프로그램간 데이터를 주고 받는 것이다. 이를 API(Application Program Interface)라 하는데 다음 포스팅에서는 JSON형의 API를 파이썬에 활용해보겠다.

Comments