반응형

<참조: 파이썬을 이용한 머신러닝, 딥러링 실전개발 입문>

 

파이썬, 기상청 웹 XML 페이지의 도시별 날씨 출력하기

 

글. 오상문 sualchi@daum.net

 

기상청에서 제공하는 사이트의 '전국 육상중기예보' 페이지에서 xml 형태로 다운로드 받고 그것을 분석해서 날씨를 출력하는 예제이디.

 

기상청 사이트는 "https://www.weather.go.kr"이고 여기에서 접근할 곳은 "weather/forecast/mid-term-rss3.jsp?stnId=108"이다.

 

xml 코드 확인해보면 다음과 같다.

 

<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0">

<channel>

<title>기상청 육상 중기예보</title>

<link>http://www.kma.go.kr/weather/forecast/mid-term_01.jsp</link>

<description>기상청 날씨 웹서비스</description>

<language>ko</language>

<generator>기상청</generator>

<pubDate>2020년 01월 07일 (화)요일 18:00</pubDate>

 <item>

<author>기상청</author>

<category>육상중기예보</category>

<title>전국 육상 중기예보 - 2020년 01월 07일 (화)요일 18:00 발표</title>

<link>http://www.kma.go.kr/weather/forecast/mid-term_01.jsp</link>

<guid>http://www.kma.go.kr/weather/forecast/mid-term_01.jsp</guid>

<description>

<header>

<title>전국 육상중기예보</title>

<tm>202001071800</tm>

<wf><![CDATA[기압골의 영향으로 11~12일과 16일은 제주도에 비가 오겠고, 동풍의 영향으로 15~16일은 강원영동에 비 또는 눈이 오겠습니다. <br />그 밖의 날은 고기압의 가장자리에 들어 구름많은 날이 많겠습니다. <br />기온은 평년(최저기온: -12~0℃, 최고기온: 0~8℃)보다 조금 높겠습니다.<br />강수량은 평년(0~3mm)보다 적겠으나, 강원영동과 제주도는 많겠습니다.]]></wf>

</header>

<body>

<location wl_ver="3">

<province>서울ㆍ인천ㆍ경기도</province>

<city>서울</city>

<data>

<mode>A02</mode>

<tmEf>2020-01-10 00:00</tmEf>

<wf>맑음</wf>

<tmn>-5</tmn>

<tmx>4</tmx>

<reliability></reliability>

<rnSt>0</rnSt>

</data>

...

<이하 생략>


 

이 자료에서 0시 기준으로 city, wf, tmn 요소의 텍스트를 가져와 출력하겠습니다. 다음은 해당 예제 소스 코드이다.


import urllib.request as req
import os.path

 

# xml 페이지 다운로드하여 파일에 저장
url = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108"
filename = "weather_forecast.xml"
if not os.path.exists(filename):
    req.urlretrieve(url, filename)
 

# xml 파일 인코딩 및 분석(파싱)하기   

# 한글 코드 설정 맟 xml 파싱 지정
xml = open(filename, encoding='utf-8').read() 
soup = BeautifulSoup(xml, 'html.parser')

 

# 각 도시의 0시 기준 기상 상태와 기온 출력

for location in soup.find_all('location'):

    # xml요소 이름을 이용하여 필요한 자료를 출력한다.
    print(location.find('city').string, ":", location.find('wf').string, "*"
          '온도', location.find('tmn').string)

 

[결과]

서울 : 맑음 * 온도: -5

인천 : 맑음 * 온도: -4

수원 : 맑음 * 온도: -5

파주 : 맑음 * 온도: -8

이천 : 맑음 * 온도: -6

평택 : 맑음 * 온도: -6

춘천 : 맑음 * 온도: -6

원주 : 맑음 * 온도: -5

강릉 : 맑음 * 온도: 0

대전 : 맑음 * 온도: -4

세종 : 맑음 * 온도: -7

홍성 : 맑음 * 온도: -6

청주 : 맑음 * 온도: -4

충주 : 맑음 * 온도: -6

영동 : 맑음 * 온도: -6

광주 : 맑음 * 온도: -2

목포 : 맑음 * 온도: -1

여수 : 맑음 * 온도: 1

순천 : 맑음 * 온도: -2

광양 : 맑음 * 온도: -1

나주 : 맑음 * 온도: -5

전주 : 맑음 * 온도: -3

군산 : 맑음 * 온도: -3

정읍 : 맑음 * 온도: -4

남원 : 맑음 * 온도: -4

고창 : 맑음 * 온도: -3

주 : 맑음 * 온도: -7

부산 : 맑음 * 온도: 1

울산 : 맑음 * 온도: -1

원 : 맑음 * 온도: -1

진주 : 맑음 * 온도: -6

거창 : 맑음 * 온도: -7

통영 : 맑음 * 온도: 0

대구 : 맑음 * 온도: -3

안동 : 맑음 * 온도: -7

포항 : 맑음 * 온도: -1

경주 : 맑음 * 온도: -3

울진 : 맑음 * 온도: -1

울릉도 : 맑음 * 온도: 3

제주 : 맑음 * 온도: 5

서귀포 : 맑음 * 온도: 6

 

<이상>

 

 

반응형

+ Recent posts