반응형
/*********************************************************************************************************
-- Title : [Py2.7] API호출 및 파일 오픈을 통한 XML 처리하기
-- Reference : Python for Data Analysis
-- Key word : pandas dataframe xml api urllib2 beautifulsoup open 파일 오픈
*********************************************************************************************************/
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | # -*- coding: utf-8 -*- import os, sys import pandas as pd import urllib2 from bs4 import BeautifulSoup # ******************************************** # -- XML 읽기 # urllib2 패키지 필요 # 파서는 BeautifulSoup 패키지 사용 # ******************************************** print("-" * 100 + "{[15]}") # ----- # movieURL = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.xml?key=430156241533f1d058c603178cc3ca0e&openDt=20150101" moviePage = urllib2.urlopen(movieURL) movieSoup = BeautifulSoup(moviePage, "html.parser") print movieSoup print(movieSoup.prettify()) # 이쁘게 들여쓰기 # ******************************************** # -- XML 원소 찾기(find_all) # ******************************************** print("-" * 100 + "{[16]}") # ----- # print movieSoup.find_all("moviecd") # xml은 소문자로 모두 처리됨 주의!!! print movieSoup.find_all("moviecd")[0].text # 태크 제거 print len(movieSoup.find_all("moviecd")) print movieSoup.find_all("moviecd")[0].text print movieSoup.find_all("movienm")[0].text print movieSoup.find_all("movienmen")[0].text print movieSoup.find_all("opendt")[0].text print movieSoup.find_all("typenm")[0].text print("-" * 100 + "{[16.2]}") # ----- # # ******************************************** # -- XML 저장할 DF 생성 # ******************************************** print("-" * 100 + "{[17]}") # ----- # df = pd.DataFrame(columns=("moviecd", "movienm", "movienmen", "opendt", "typenm")) print df moviecnt = len(movieSoup.find_all("movie")) print moviecnt for i in range(moviecnt): df.loc[i] = [movieSoup.find_all("moviecd")[i].text, movieSoup.find_all("movienm")[i].text, movieSoup.find_all("movienmen")[i].text, movieSoup.find_all("opendt")[i].text, movieSoup.find_all("typenm")[i].text ] print df print("-" * 100 + "{[17.2]}") # ----- # # -- 기존 컬럼을 인덱스 컬럼으로 변경 df = df.set_index("movieCd") print df print("-" * 100 + "{[17.5]}") # ----- # # ******************************************** # -- 엑셀 출력 # ******************************************** print("-" * 100 + "{[18]}") # ----- # excelOutPath = "C:\\samples\\movie_xml_new.xlsx" writer = pd.ExcelWriter(excelOutPath, engine="xlsxwriter") df.to_excel(writer, sheet_name="Sheet1", index=True) writer.save() # ******************************************** # -- XML 파일 호출을 통한 XML 처리 # ******************************************** print("-" * 100 + "{[19]}") # ----- # # -- 파일 오픈 xmlFile = open("C:\\samples\\movie.xml", "r") openFile = xmlFile.read() # -- 파일의 string 데이터를 parsing하기 위해 변환 fileSoup = BeautifulSoup(openFile, "html.parser") print fileSoup.prettify() # -- 파일 닫기 xmlFile.close() print("-" * 100 + "{[19.2]}") # ----- # # -- XML 원소 추출 # -- 파일 자체가 UTF-8 이어야 한글이 깨지지 않음(Ultraedit에서 UTF-8로 변환). print fileSoup.find_all("moviecd")[0].text print fileSoup.find_all("movienm")[0].text print fileSoup.find_all("movienmen")[0].text print fileSoup.find_all("opendt")[0].text print fileSoup.find_all("typenm")[0].text print("-" * 100 + "{[19.4]}") # ----- # # -- XML 저장할 DF 생성 df = pd.DataFrame(columns=("moviecd", "movienm", "movienmen", "opendt", "typenm")) print df print("-" * 100 + "{[19.6]}") # ----- # # -- 데이터 입력 tagcnt = len(fileSoup.find_all("movie")) print tagcnt for i in range(tagcnt): df.loc[i] = [fileSoup.find_all("moviecd")[i].text, fileSoup.find_all("movienm")[i].text, fileSoup.find_all("movienmen")[i].text, fileSoup.find_all("opendt")[i].text, fileSoup.find_all("typenm")[i].text, ] print df print("-" * 100 + "{[19.8]}") # ----- # | cs |
-- 샘플 파일
반응형