Scrap XML & JSON [KOR]
BeautifulSoup 으로 웹 스크래핑과 더불어서 XML과 JSON 형식의 파일까지 스크랩 할 수 있다.¶
BeautifulSoup 모듈로 XML 데이터 처리¶
In [1]:
from bs4 import BeautifulSoup
In [2]:
# 만들어진 test.xml가지고 실험
with open('test.xml', mode = 'r', encoding = 'utf-8') as f:
xmlfile = f.read()
bsObj = BeautifulSoup(xmlfile, 'html.parser') #beautifulsoup 객체 타입으로 변환
print(bsObj, ' ',type(bsObj))
print(bsObj.prettify())
<?xml version="1.0" encoding="UTF-8"?> <items> <item> <name id="ks1">홍길동</name> <tel>111-1111</tel> <exam eng="80" kor="100"></exam> </item> <item> <name id="ks2">신기해</name> <tel>111-2222</tel> <exam eng="90" kor="88"></exam> </item> </items> <class 'bs4.BeautifulSoup'> <?xml version="1.0" encoding="UTF-8"?> <items> <item> <name id="ks1"> 홍길동 </name> <tel> 111-1111 </tel> <exam eng="80" kor="100"> </exam> </item> <item> <name id="ks2"> 신기해 </name> <tel> 111-2222 </tel> <exam eng="90" kor="88"> </exam> </item> </items>
In [4]:
itemTag = bsObj.findAll('item') #<item></item>태그 다 가져오기!(2개 가져왔당)
print(itemTag[0]) #0번째 item태그
print(itemTag[1]) #1번째 item태그
<item> <name id="ks1">홍길동</name> <tel>111-1111</tel> <exam eng="80" kor="100"></exam> </item> <item> <name id="ks2">신기해</name> <tel>111-2222</tel> <exam eng="90" kor="88"></exam> </item>
In [5]:
nameTag = bsObj.findAll('name') #<name></name>태그 다 가져오기(
print(nameTag)
print(nameTag[0]['id']) #0번째 name태그의 id #ks1
[<name id="ks1">홍길동</name>, <name id="ks2">신기해</name>] ks1
In [6]:
for i in nameTag: #<name></name>태그들의 모든 id를 읽어오기, ks1, ks2
print(i['id'])
ks1 ks2
In [7]:
for i in itemTag:
nameTag = i.findAll('name') #name 태그
for j in nameTag:
print('id :' + j['id'] + ', name : ' + j.string)
tel = i.find('tel') #tel 태그
print('tel :' + tel.string)
for j in i.findAll('exam'): #exam 태그
print('kor:' + j['kor'] + ', eng:' +j['eng'])
print()
id :ks1, name : 홍길동 tel :111-1111 kor:100, eng:80 id :ks2, name : 신기해 tel :111-2222 kor:88, eng:90
강남구 도서관 현황 xml 읽기¶
In [10]:
import urllib.request
url = "http://openapi.seoul.go.kr:8088/sample/xml/SeoulLibraryTime/1/5/"
datas = urllib.request.urlopen(url).read().decode('utf-8') #<http.client.HTTPResponse object at 0x0000020D0A5CF370>
xmlObj = BeautifulSoup(datas, 'lxml')
libData = xmlObj.select('row') #xmlObj.findAll('row')와 동일
#print(libData) #읽어왔을때 tag들이 다 소문자로 되어있다. 그래서 밑의 for문에서 소문자태그로 작성해줘야해!
for lib in libData:
#name = lib.find('LBRRY_NAME').string #아래와 동일
name = lib.find('lbrry_name').text #print(libData) 기준이다 ! 소문자 tag
addr = lib.find('adres').string #print(libData) 기준이다 ! 소문자 tag
print('도서관 명 :' + name + ', 주소 :' + addr)
도서관 명 :LH강남3단지작은도서관, 주소 :서울특별시 강남구 자곡로3길 22 도서관 명 :강남구립못골도서관, 주소 :서울시 강남구 자곡로 116 도서관 명 :강남역삼푸른솔도서관, 주소 :서울특별시 강남구 테헤란로8길 36. 4층 도서관 명 :강남한신휴플러스8단지작은도서관, 주소 :서울특별시 강남구 밤고개로27길 20(율현동, 강남한신휴플러스8단지) 도서관 명 :강남한양수자인작은씨앗도서관, 주소 :서울특별시 강남구 자곡로 260
BeautifulSoup 모듈로 JSON 데이터 처리¶
In [11]:
import json
In [12]:
dict = {'name':'신선해', 'age':22, 'score':['90', '80', '100']}
print(dict)
{'name': '신선해', 'age': 22, 'score': ['90', '80', '100']}
In [13]:
# 인코딩 : 파이썬 객체를 문자열로 변환
str_val = json.dumps(dict)
print(str_val, type(str_val))
print(str_val[0:10])
{"name": "\uc2e0\uc120\ud574", "age": 22, "score": ["90", "80", "100"]} <class 'str'> {"name": "
In [15]:
# 디코딩 : 문자열을 파이썬 객체로 변환
json_val = json.loads(str_val)
print(json_val)
print(json_val["name"])
print(json_val["score"])
print(json_val.values())
print(json_val.get('name'))
{'name': '신선해', 'age': 22, 'score': ['90', '80', '100']} 신선해 ['90', '80', '100'] dict_values(['신선해', 22, ['90', '80', '100']]) 신선해
강남구 도서관 현황 json 읽기¶
In [16]:
import urllib.request
url = 'http://openapi.seoul.go.kr:8088/sample/json/SeoulLibraryTime/1/5/'
plainText = urllib.request.urlopen(url).read().decode()
print(plainText)
{"SeoulLibraryTime":{"list_total_count":1363,"RESULT":{"CODE":"INFO-000","MESSAGE":"정상 처리되었습니다"},"row":[{"LBRRY_NAME":"LH강남3단지작은도서관","CODE_VALUE":"강남구","ADRES":"서울특별시 강남구 자곡로3길 22","FDRM_CLOSE_DATE":"매주 화요일,목요일","TEL_NO":"02-459-8700","XCNTS":"37.46997231","YDNTS":"127.0910208"},{"LBRRY_NAME":"강남구립못골도서관","CODE_VALUE":"강남구","ADRES":"서울시 강남구 자곡로 116","FDRM_CLOSE_DATE":"매월 둘째, 넷째 화요일 및 일요일을 제외한 법정공휴일","TEL_NO":"02-459-5522","XCNTS":"37.47153836","YDNTS":"127.096582"},{"LBRRY_NAME":"강남역삼푸른솔도서관","CODE_VALUE":"강남구","ADRES":"서울특별시 강남구 테헤란로8길 36. 4층","FDRM_CLOSE_DATE":"2,4 주 화요일 및 법정 공휴일","TEL_NO":"02-2051-1178","XCNTS":"37.4964968","YDNTS":"127.0320274"},{"LBRRY_NAME":"강남한신휴플러스8단지작은도서관","CODE_VALUE":"강남구","ADRES":"서울특별시 강남구 밤고개로27길 20(율현동, 강남한신휴플러스8단지)","FDRM_CLOSE_DATE":"","TEL_NO":"","XCNTS":"37.46971323","YDNTS":"127.1130164"},{"LBRRY_NAME":"강남한양수자인작은씨앗도서관","CODE_VALUE":"강남구","ADRES":"서울특별시 강남구 자곡로 260","FDRM_CLOSE_DATE":"매주 일요일","TEL_NO":"","XCNTS":"37.47586067","YDNTS":"127.1134903"}]}}
In [17]:
jsonData = json .loads(plainText)
libData = jsonData.get("SeoulLibraryTime").get("row")
print(libData)
[{'LBRRY_NAME': 'LH강남3단지작은도서관', 'CODE_VALUE': '강남구', 'ADRES': '서울특별시 강남구 자곡로3길 22', 'FDRM_CLOSE_DATE': '매주 화요일,목요일', 'TEL_NO': '02-459-8700', 'XCNTS': '37.46997231', 'YDNTS': '127.0910208'}, {'LBRRY_NAME': '강남구립못골도서관', 'CODE_VALUE': '강남구', 'ADRES': '서울시 강남구 자곡로 116', 'FDRM_CLOSE_DATE': '매월 둘째, 넷째 화요일 및 일요일을 제외한 법정공휴일', 'TEL_NO': '02-459-5522', 'XCNTS': '37.47153836', 'YDNTS': '127.096582'}, {'LBRRY_NAME': '강남역삼푸른솔도서관', 'CODE_VALUE': '강남구', 'ADRES': '서울특별시 강남구 테헤란로8길 36. 4층', 'FDRM_CLOSE_DATE': '2,4 주 화요일 및 법정 공휴일', 'TEL_NO': '02-2051-1178', 'XCNTS': '37.4964968', 'YDNTS': '127.0320274'}, {'LBRRY_NAME': '강남한신휴플러스8단지작은도서관', 'CODE_VALUE': '강남구', 'ADRES': '서울특별시 강남구 밤고개로27길 20(율현동, 강남한신휴플러스8단지)', 'FDRM_CLOSE_DATE': '', 'TEL_NO': '', 'XCNTS': '37.46971323', 'YDNTS': '127.1130164'}, {'LBRRY_NAME': '강남한양수자인작은씨앗도서관', 'CODE_VALUE': '강남구', 'ADRES': '서울특별시 강남구 자곡로 260', 'FDRM_CLOSE_DATE': '매주 일요일', 'TEL_NO': '', 'XCNTS': '37.47586067', 'YDNTS': '127.1134903'}]
In [18]:
name = libData[0].get('LBRRY_NAME')
print(name)
LH강남3단지작은도서관
In [19]:
datas = []
for ele in libData:
name = ele.get('LBRRY_NAME')
tel = ele.get('TEL_NO')
addr = ele.get('ADRES')
print(name + " " + tel + " " + addr)
imsi = [name, tel, addr]
datas.append(imsi)
LH강남3단지작은도서관 02-459-8700 서울특별시 강남구 자곡로3길 22 강남구립못골도서관 02-459-5522 서울시 강남구 자곡로 116 강남역삼푸른솔도서관 02-2051-1178 서울특별시 강남구 테헤란로8길 36. 4층 강남한신휴플러스8단지작은도서관 서울특별시 강남구 밤고개로27길 20(율현동, 강남한신휴플러스8단지) 강남한양수자인작은씨앗도서관 서울특별시 강남구 자곡로 260
In [20]:
# dataframe으로 저장
import pandas as pd
df = pd.DataFrame(datas, columns=['도서관명', '전화', '주소'])
print(df)
도서관명 전화 주소 0 LH강남3단지작은도서관 02-459-8700 서울특별시 강남구 자곡로3길 22 1 강남구립못골도서관 02-459-5522 서울시 강남구 자곡로 116 2 강남역삼푸른솔도서관 02-2051-1178 서울특별시 강남구 테헤란로8길 36. 4층 3 강남한신휴플러스8단지작은도서관 서울특별시 강남구 밤고개로27길 20(율현동, 강남한신휴플러스8단지) 4 강남한양수자인작은씨앗도서관 서울특별시 강남구 자곡로 260
Categories :
Practice