1. XML ์ด๋?
๐ eXtensible Markup Language ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ์ ๋ฌ์ ์ํด ๋ง๋ ๋ค๋ชฉ์ ๋งํฌ์
์ธ์ด Markup Language
๐ ๋งํฌ์
์ธ์ด๋ ์ผ๋ฐ์ ์ธ ํ
์คํธ์ ๊ตฌ๋ถ๋๋ ํ๊ทธ Tag๋ฅผ ์ด์ฉํด ๋ฌธ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํ ํ๋ ์ธ์ด
๐ JSON๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ์ดํฐ ์ ๋ฌ์ ๋ชฉ์ ์ผ๋ก ๋ง๋ ๊ตฌ์กฐํ๋ ํ
์คํธ ํ์
๐ ๋ํ์ ์ธ ๋งํฌ์
์ธ์ด๋ก๋ HTML HyperText Markup Language
๐ HTML์ ๊ฒฝ์ฐ๋ ํ๊ทธ๊ฐ ๋ฏธ๋ฆฌ ์ ํด์ ธ ์์ง๋ง XML์ ์์ ์ด ํ๊ทธ๋ฅผ ์ ์ํด์ ์ฌ์ฉํ ์ ์์
โก๏ธ ๋จ XML ๋ฌธ์์ ๊ท์น์ ๋ฐ๋ผ์ผ ํจ
๐ ํ๊ทธ๋ '<๋ฌธ์์ด>'๋ก ์์ํด์ '</๋ฌธ์์ด>'๋ก ๋๋์ผ ํ๋ค
๐ ์์๊ณผ ๋ ํ๊ทธ์ ๋ฌธ์์ด์ ๊ฐ์์ผ ํ๋ฉฐ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถ
๐ ์ค์ฒฉํด ์ฌ๋ฌ ๊ฐ๋ฅผ ์ด์ฉํ ์ ์๋๋ฐ ์ด๋ ํ๊ทธ๋ ๋ฐ๋์ ์ฌ๋ฐ๋ฅธ ์์๋๋ก ์ด์ฉํด์ผ ํจ
ex. '<abc><def> ~ </def></abc>' ์ ๊ฐ์ด ๋์ค์ ๋์จ ์์ ํ๊ทธ์ ๋์ํ๋ ๋ ํ๊ทธ๊ฐ ๋จผ์ ๋์์ผ ํจ
๐ XML ๋ฌธ์์์๋ ์์ ํ๊ทธ์์ ๋ ํ๊ทธ๊น์ง๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ ์์ element๋ผ๊ณ ํจ
๐ XML ๋ฌธ์์๋ ๋ฐ๋์ ์ต์์ root ์์๊ฐ ์์ด์ผ ํจ
๐ ์ต์์ ์์๋ ์์๊ณผ ๋ ํ๊ทธ๋ก ๋ค๋ฅธ ๋ชจ๋ ์์๋ฅผ ๊ฐ์ธ์ผ ํจ
๐ ์ฃผ์์ '<!--'์ '-->'๋ก ๋ฌธ์์ด์ ๊ฐ์ธ์ ํ์. ์ฆ '<!-- ์ด๊ฒ์ ์ฃผ์์
๋๋ค -->'์ ๊ฐ์ด ์ฌ์ฉ
๐ xml์ ์ง์ ํ๋ ๋ชจ๋์ ๋ด์ฅ ๋ชจ๋๋ก xml์ด ์๊ณ , ์ธ๋ถ ๋ชจ๋์ ๊ฒฝ์ฐ xmltodict ์ฌ์ฉ
๐ xml ๋ฐ์ดํฐ๋ฅผ ํ์ด์ฌ์ ๋์
๋๋ฆฌ ํ์
์ผ๋ก ๋ฐ๋ก ๋ณํ
๐ xmltodict ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ XML ํ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ด์ฌ์ ๋์
๋๋ฆฌ ํ์
์ผ๋ก ๋ณํํ๋ ํจ์
๐ xmltodict.parse(xml_input, [ xml_attribs=True ํน์ False ])
๐ xml_input์ XML ํ์
์ ๋ฐ์ดํฐ
๐ xml_attribs์ ๊ธฐ๋ณธ ๊ฐ์ True
โก๏ธ False ์ด๋ฉด XML ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋์
๋๋ฆฌ ํ์
์ผ๋ก ๋ณํํ ๋ ์์ฑ์ ๋ฌด์
๐ pprint.pprint() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด์ฉ์ด ๋ค์ฌ์ฐ๊ธฐ ๋ ์ํ๋ก ๋ณด๊ธฐ์ข๊ฒ ์ถ๋ ฅ ๊ฐ๋ฅ
import xmltodict
import pprint
with open('../input_2/data.xml', 'r', encoding='utf-8') as xml_file:
dict_data = xmltodict.parse(xml_file.read(), xml_attribs=True) # xml ๋ฐ์ดํฐ๋ฅผ ๋์
๋๋ฆฌ๋ก ๋ณ๊ฒฝ
#print(dict_data)
#print(dict_data['response']['body']['items'])
datas = dict_data['response']['body']['items']
pprint.pprint(datas)
2. ์คํ๋ผ ๊ณต์ฐ ์ ๋ชฉ๊ณผ ๋งํฌ์ฃผ์ ์ถ์ถ ๋ฐ ์ ์ฅ
import csv
from datetime import datetime
import xmltodict
import pprint
import requests
# 1. ๋ฐ์ดํฐ ์ถ์ถ
url = 'https://www.daeguoperahouse.org/rss.php'
response = requests.get(url)
dict_data = xmltodict.parse(response.text)
pprint.pprint(dict_data)
# 2. ํ์ํ ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ
data_list = dict_data['rss']['channel']['item']
new_datas:list[dict] = list() # ํ์ ๋ด์ฉ๋ง ๋ด์ ๋ฆฌ์คํธ ํ์
for k in data_list:
new_data = dict()
new_data['title'] = k['title']
new_data['link'] = k['link']
new_datas.append(new_data)
pprint.pprint(new_datas)
# 3. ํ์ฌ ๋ ์ง๋ก ํ์ผ๋ช
์ง์ ํด์ ์ ์ฅํ๊ธฐ
today = datetime.now().strftime('%y%m%d') # ํ์ฌ ๋ ์ง ๊ตฌํ๊ธฐ
print(today)
with open(f'../output_02/daeguoperahouse_{today}.csv', 'wt', newline='', encoding='utf-8') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=['title', 'link'])
writer.writeheader()
for k in new_datas:
writer.writerow(k)
print('ํ์ผ ์์ฑ์ ์ฑ๊ณตํ์ต๋๋ค.')
[ ๋ด์ฉ ์ฐธ๊ณ : IT ํ์ ๊ฐ์ ]