2015. 2. 6. 02:09ㆍProjects/TJSSM
안녕하세요?
이번시간에는 저번시간에 하기로 했던.. URL 로부터 feature 이미지를 가져오는 기능을 구현하도록 하겠습니다.
아래는 대전 멤버쉽 남두현님의 정규식관련 자료입니다.
이번 기능 구현에 많은 도움을 주셨습니다.
Python Assignment 5
Author : 2009135046, Doohyun Nam
• [1번 문제] 클래스와 모듈의 공통점과 차이점에 대해 설명하시오.
클래스와 모듈의 공통점은 비슷하거나 관련된 일을 하는 함수나 상수값들을 모아서 저장하는 것을 말하며, 별도의 이름공간을 가지고 있다. 이러한 이유는 재사용성과 유지보수 측면에 초점을 맞추고 있다. 차이점이라면, 모듈은 파일단위로 이름공간을 정의하고, 클래스는 클래스 공간에 이름공간을 구성한다.
• [2번 문제] 다형성에 대해 설명하고 다형성을 보여주는 자신만의 파이썬 코드 예제를 제시하시오.
# -*- coding: utf-8 -*-
class FlyBehavior:
def fly(self):
pass
class FlyWithWings(FlyBehavior):
def fly(self):
print "날아 다님"
class FlyNoWay(FlyBehavior):
def fly(self):
print "날수 없음"
class QuackBeHavior:
def quack(self):
pass
class Quack(QuackBeHavior):
def quack(self):
print "꽥꽥"
class Squack(QuackBeHavior):
def quack(self):
print "삑삑"
class MuteQuack(QuackBeHavior):
def quack(self):
print ""
class Duck:
def __init__(self, quack, fly):
self.quackBeHavior = quack
self.flyBehavior = fly
def quack(self):
self.quackBeHavior.quack()
def fly(self):
self.flyBehavior.fly()
mallardDuck = Duck(Quack(), FlyWithWings())
rubberDuck = Duck(Squack(), FlyNoWay())
mallardDuck.fly()
rubberDuck.fly()
mallardDuck.quack()
rubberDuck.quack()
날아 다님 날수 없음 꽥꽥 삑삑
[풀이] 상속 관계 내의 다른 클래스들의 인스턴스들이 같은 멤버 함수 호출에 대해 각각 다르게 반응하도록 하는 기능, 연산자 오버로딩도 다형성을 지원하는 중요한 기술
[예제] 디자인패턴 중 전략 패턴을 사용한 예제이다. FlyBehavior, QuackBeHavior 을 상속받은 각각의 행동에 대해 실행시간에 각 객체들은 다른 반응을 지원하고 있다. 다음의 예제는 상속된 quack나 squack보다는 이를 구성관계에 있는 duck 객체가 더욱 중요하다. duck객체가 초기화될때 어떤 객체를 가지고 있는지에 따라 다른 행동을 취할 수 있다.
• [3번 문제] 다음 각 요구사항 모두를 만족시키는 Counter 클래스를 코딩하시오 (정답을 각 요구사항별로 입력할 필요 없이 3번 문제에 대해 1개의 클래스 정의 코드를 제시하면 된다.)
# -*- coding: utf-8 -*-
class Counter(object):
def __init__(self, value, step = 1):
self.step = step
self.value = value
def incr(self):
self.value += self.step
def __str__(self):
return str(self.value)
def __call__(self):
self.incr()
def __add__(self, other):
return self.operatorHelper(other, "+")
def __sub__(self, other):
return self.operatorHelper(other, "-")
def operatorHelper(self, other, code):
try:
if type(self) == type(other):
exec (compile("self.value %s= other.value" % code, '<string>', 'single'))
exec (compile("self.step %s= other.step" % code, '<string>', 'single'))
else:
exec (compile("self.value %s= int(other)" % code, '<string>', 'single'))
except:
pass
return self
def __cmp__(self, other):
value = other;
try:
if type(self) == type(other):
value = other.value
else:
value = int(other)
except:
pass
return cmp(self.value, value)
#요구 사항 1번
c = Counter(10)
d = Counter(10, 2)
#요구사항 2번
print "요구 사항 2번 출력"
print c, d
#요구사항 3번
c.incr()
d.incr()
print "요구 사항 3번 출력"
print c, d
#요구사항 4번
c()
d()
print "요구 사항 4번 출력"
print c, d
#요구사항 5번
c = c + 5
d = d - 5
print "요구 사항 5번 출력"
print c, d
#요구사항 6번
print "요구 사항 6번 출력"
print c > 10
print d > 10
print c < 10
print d < 10
print c == "17"
print d != "9"
print c > d
요구 사항 2번 출력 10 10 요구 사항 3번 출력 11 12 요구 사항 4번 출력 12 14 요구 사항 5번 출력 17 9 요구 사항 6번 출력 True False False True True False True
[풀이]
-Needs1 : init 함수에서 매개변수를 default로 1로 초기화 하여 충족시켰다.
-Needs2 : str 함수를 이용하면 java의 toString과 같은 효과를 볼 수 있다.
-Needs3 : 요구사항대로 값을 증가시켰다.
-Needs4 : call 함수를 사용하여, incr 함수를 인스턴스로 불러냈다.
-Needs5 : sum , sub 함수를 사용하여 개발했다. 확장성을 생각하여, 템플릿 메소드 패턴을 적용하기 위한 operatorHelper() 라는 메소드를 두어, 동적으로 연산자가 결정되도록 진행했다. 연산은 정수뿐이 아닌 다른 type도 들어올 수 있도록 개발했다.
-Needs6 : cmp 함수를 사용했다. 위와 같이 다른 type에 대응할 수 있도록 제작했다. cmp 함수를 사용하면, 별다른 알고리즘 없이 진행할 수 있다.
• [4번 문제] 다음은 내장 자료형 list를 서브클래싱하여 만든 MySet 클래스 정의 내용이다. 다음 클래스 정의에서 init(), str()(), elimicate_duplicate()의 세 개의 메소드 코드 내용을 자신이 다른 사람에게 가르친다고 생각하며 설명해보시오.
• [5번 문제] 4번 문제에 정의된 MySet 클래스에 메소드를 추가하여 다음 각 요구사항 모두를 만족시키는 코딩을 제시하시오 (정답을 각 요구사항별로 입력할 필요 없이 5번 문제에 대해 1개의 MySet 클래스 정의 코드를 제시하면 된다.)
• [6번 문제] 5번 문제에서 정의한 MySet 클래스에 대해 다음 예제를 수행하면 오류없이 올바르게 동작하는 것을 확인할 수 있다. 다음 예제 내에 있는 len(), bool() 내장함수와 in 키워드 사용 예제가 별다른 메소드 정의를 하지 않았는 데도 올바르게 수행되는 이유를 설명하시오. - 해설은 4, 5, 6번 모두 같이 적었다.
# -*- coding: utf-8 -*-
import copy
class MySet(list):
def __init__(self, l):
for e in l:
self.append(e)
MySet.eliminate_duplicate(self)
def __str__(self):
result = "MySet: {"
for e in self:
result = result + str(e) + " ,"
result = result[0:len(result)-2] + "}"
return result
def __or__(self, other):
return MySet(self + other)
def __and__(self, other):
s = []
for e in other:
if e in self :
s.append(e)
return MySet(s)
def __sub__(self, other):
s = copy.deepcopy(self)
for e in self:
if e in other:
s.remove(e)
return MySet(s)
@staticmethod
def eliminate_duplicate(l):
s = []
for e in l:
if e not in s:
s.append(e)
l[:] = []
for e in s:
l.append(e)
#요구사항 1번
print "요구사항 1번 출력"
s = MySet([1, 2, 2, 3])
t = MySet([2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 9])
s = s | t
print s
#요구사항 2번
print "요구사항 2번 출력"
s = MySet([1, 2, 3])
t = MySet([3, 4, 5])
s = s & t
print s
#요구사항 3번
print "요구사항 3번 출력"
s = MySet([1, 2, 3,4])
t = MySet([3, 2])
s = s - t
print s
요구사항 1번 출력 MySet: {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9} 요구사항 2번 출력 MySet: {3} 요구사항 3번 출력 MySet: {1 ,4}
[4번 풀이] MySet은 list를 상속받고 있다. 즉 MySet은 list의 기능을 모두 사용할 수 있고, 이 클래스는 적어도 list보다 확장의 여지가 있다.
- init() : init의 경우 클래스의 생성자와 같다. init에서 list의 원소를 모두 담고, static method인 eliminate_duplicate 를 호출하여, 겹치는 자료를 삭제했다.
- str(): str 메소드는 자바의 toString 과 같다. 위의 메소드는 일정한 폼으로 list가 나오도록 제공하고 있다.
- elimicate_duplicate() : static 메소드인 이 메소드는 겹치는 자료를 담지 않아 집합 형태로 유지시키는 메소드이다. 생성자에서 공통적으로 사용하기 때문에 static으로 선언했다.
[5번 풀이]
-Needs1 : or 메소드를 사용하여 구현했다. 구현 시 return의 결과가 MySet을 유지해야하며, 정적 메소드인 eliminateduplicate를 사용하기 위해 MySet 형태로 return 한다.
-Needs2 : and 메소드를 사용하여 구현했다. MySet 형태로 return 한 이유는 위와 같으며, s에 있는 원소 중 다른 리스트에 있는 원소만 input하도록 했다.
-Needs3 : _sub 메소드를 사용하여 구현했다. self의 원소 중 다른 리스트에 있는 원소를 remove를 이용하여 제거했다.
[6번 풀이]
list를 상속받았기 때문에 별다른 구현을 하지 않아도 list 의 기능을 모두 사용할 수 있다.
•[7번 문제] 이전 Assignment 3 (Assignment 4가 아님)의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3과 Assignment 4를 확장/변형하여 다음과 같은 조건을 만족하도록 구현하시오.
◾1) 새로운 클래스 WebWordsFrequency를 정의하시오.
◾2) 생성자에 URL을 0개에서 임의의 개수를 넣을 수 있도록 생성자 인수를 가변인수로 정의하여 각각의 URL을 리스트 자료형에 유지하시오.
w1 = WebWordsFrequency('http://www.daum.net', 'http://www.naver.com', 'http://www.google.co.kr')
w2 = WebWordsFrequency('http://www.daum.net', 'http://www.naver.com')
w3 = WebWordsFrequency()
◾3) addUrl() 메소드를 구현하여 인스턴스를 생성한 이후에도 URL을 추가할 수 있도록 한다.
◦반드시 1개의 URL을 추가하도록 구현 (즉, 동시에 여러 개의 URL을 추가하는 것은 배제)
w1.addUrl('http://cse.koreatech.ac.kr')
w3.addUrl('http://www.koreatech.ac.kr')
◾4) removeUrl() 메소드를 구현하여 URL을 삭제할 수 있도록 한다. ◦반드시 1개의 URL을 삭제하도록 구현 (즉, 동시에 여러 개의 URL을 삭제하는 것은 배제)
w1.removeUrl('http://www.daum.net')
w2.removeUrl('http://www.naver.com')
◾5) listUrls() 메소드를 구현하여 현재 등록된 모든 URL을 출력하는 기능을 추가
w1.listUrls() http://www.naver.com http://www.google.co.kr http://cse/koreatech.ac.kr
◾6) getWordsFrequency() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전을 반환하시오. ◦만약 등록된 URL이 없다면 공백 사전을 반환
w1.getWordsFrequency() {'다음': 8, '안녕': 12, 'world': 2, '우리': 11, 'hello': 1, 'python': 1}
◾7) getMaxFreqencyWords() 메소드를 구현하여 각 URL의 웹페이지들을 종합적으로 분석한 단어 출현 빈도 사전에서 가장 많이 출현한 단어 리스트를 반환하시오. ◦최다 출현 단어의 빈도수가 동일한 경우 모두 출력해주어야 함 ◦만약 등록된 URL이 없다면 None을 반환
w1.getMaxFreqencyWords() 우리 w2.getMaxFreqencyWords() 다음에 안녕
◾8) Assignment 4에서 요구했던 파일로 저장하는 코드는 모두 삭제하시오.
# -*- coding: utf-8 -*-
import string
import urllib
import re
class WebWordsFrequency():
def __init__(self, *argv):
self.urlList = list(argv)
self.frequency = dict()
def addUrl(self, urls):
self.urlList.append(urls)
def removeUrl(self, urls):
self.urlList.remove(urls)
def __str__(self):
return str(self.urlList)
def listUrls(self):
for x in self.urlList:
print x
def getMaxFreqencyWords(self):
for x in self.urlList:
self.urlParser(x)
wordList = self.frequency.keys()
s = list()
for word in wordList:
s.append([word, self.frequency[word]])
s.sort(self.mycmp)
maxValue = s[0][1]
i = 0
size = len(s)
while maxValue == s[i][1] and i < size:
print s[i][0]
i+=1
def mycmp(self, a1, a2):
return cmp(a2[1], a1[1])
def myPrint(self, dic):
print '{',
key = dic.keys()
for x in key:
print "'%s' : %s," % (x, dic.get(x)),
print '}'
def getWordsFrequency(self):
for x in self.urlList:
self.urlParser(x)
self.myPrint(self.frequency)
def urlParser(self, URL):
myUrl = urllib.urlopen(URL).read()
myUrl = re.sub('<( )*head([^>])*?>','<head>', myUrl)
myUrl = re.sub('<( )*(/)( )*?head()*>','</head>', myUrl)
myUrl = re.sub('(<head>)[\s\S]*(</head>)',' ', myUrl) ##헤더 제거
myUrl = re.sub('<( )*script([^>])*?>','<script>', myUrl)
myUrl = re.sub('<( )*(/)( )*?script()*>','</script>', myUrl)
myUrl = re.sub('(<script>)([^(<script>\.</script>)])*?(</script>)',' ', myUrl)
myUrl = re.sub('(<script>)[\s\S]*?(</script>)',' ', myUrl) ##스크립트 제거
myUrl = re.sub('<( )*style([^>])*?>','<style>', myUrl)
myUrl = re.sub('<( )*(/)( )*?style()*>','</style>', myUrl)
myUrl = re.sub('(<style>)[\s\S]*?(</style>)',' ', myUrl) ##style(css) 제거
myUrl = re.sub('<( )*object([^>])*?>','<object>', myUrl)
myUrl = re.sub('<( )*(/)( )*?object()*>','</object>', myUrl)
myUrl = re.sub('(<object>)[\s\S]*?(</object>)',' ', myUrl) ##object 제거
myUrl = re.sub('<( )*link([^>])*?>','<link>', myUrl)
myUrl = re.sub('<( )*(/)( )*?link()*>','</link>', myUrl)
myUrl = re.sub('(<link>)[\s\S]*?(</link>)',' ', myUrl) ##link 태그 제거
#태그 자체만 지우는 정규식들
myUrl = re.sub('<( )*span([^>])*?>','<span>', myUrl)
myUrl = re.sub('<( )*(/)( )*?span()*>','</span>', myUrl)
myUrl = re.sub('<( )*div([^>])*?>','<div>', myUrl)
myUrl = re.sub('<( )*(/)( )*?div()*>','</div>', myUrl)
myUrl = re.sub('<( )*ul([^>])*?>','<ul>', myUrl)
myUrl = re.sub('<( )*(/)( )*?ul()*>','</ul>', myUrl)
myUrl = re.sub('<( )*li([^>])*?>','<li>', myUrl)
myUrl = re.sub('<( )*(/)( )*?li()*>','</li>', myUrl)
myUrl = re.sub('<( )*a([^>])*?>','<a>', myUrl)
myUrl = re.sub('<( )*(/)( )*?a()*>','</a>', myUrl)
myUrl = re.sub('<( )*p([^>])*?>','<p>', myUrl)
myUrl = re.sub('<( )*(/)( )*?p()*>','</p>', myUrl)
myUrl = re.sub('<( )*h?([^>])*?>','<h>', myUrl)
myUrl = re.sub('<( )*(/)( )*?h?()*>','</h>', myUrl)
myUrl = re.sub('<( )*time?([^>])*?>','<time>', myUrl)
myUrl = re.sub('<( )*(/)( )*?time()*>','</time>', myUrl) #
myUrl = re.sub('<( )*input([^>])*?>','', myUrl)
myUrl = re.sub('<(ul|image|a|div|span|table|tr|td|li|p|strong|h?|small|footer|html|body|time)>',' ', myUrl)
myUrl = re.sub('</(ul|image|a|div|span|table|tr|td|li|p|strong|h?|small|footer|html|body|time)>',' ', myUrl)
myUrl = re.sub('(°(;)|<(;)|>(;)|"(;)| (;)|&(;)|&lsquo(;)|&rsquo(;)| (;)|&ldquo(;)|&rdquo(;)|&sdot(;))',' ', myUrl) #기타 특수문자 제거
myUrl = re.sub('(\\r){1,20}|(\\n){1,20}|(\\r\\n){1,20}',' ',myUrl) # 개행문자 제거
l1 = myUrl.split() # 스페이스 단위로 단어 찾기.
l2 = []
for x in l1:
word = ''
for w in x:
if w not in string.punctuation: #멤버십 검사
word += w
if len(word) != 0:
try:
l2.append(unicode(word, 'utf-8'))
except:
pass
for x in l2:
if self.frequency.has_key(x):
self.frequency[x] = self.frequency[x] + 1
else:
self.frequency[x] = 1
#요구사항 2번
w1 = WebWordsFrequency('http://www.daum.net', 'http://www.naver.com', 'http://www.google.co.kr')
w2 = WebWordsFrequency('http://www.daum.net', 'http://www.naver.com')
w3 = WebWordsFrequency()
#요구사항 3번
w1.addUrl('http://cse.koreatech.ac.kr')
#요구사항 4번
w1.removeUrl('http://www.daum.net')
w2.removeUrl('http://www.naver.com')
#요구사항 5번
print "요구사항 5번 출력"
w1.listUrls()
#요구사항 6번
print "\n요구사항 6번 출력"
w1.getWordsFrequency()
#요구사항 7번
print "\n요구사항 7번 출력"
w1.getMaxFreqencyWords()
요구사항 5번 출력 http://www.naver.com http://www.google.co.kr http://cse.koreatech.ac.kr 요구사항 6번 출력 { '원조' : 1, '아이디어' : 1, '전문보기' : 2, '라인' : 1, '있어요' : 1, '라이센스' : 2, '제안은' : 1, '시스템글꼴' : 1, '최초' : 1, '네이버SE' : 1, '트라우마' : 1, '커버스토리바람' : 1, '흥얼흥얼' : 1, '뮤직' : 3, '넘어진' : 1, '설치' : 4, '이어집니다' : 1, '네이버me' : 1, '경우' : 1, '쓰는' : 1, '메인뉴스' : 1, '건강' : 1, '풍경은' : 1, '입은' : 1, '타임스퀘어' : 2, '주인공' : 1, '실시간' : 1, '생방송' : 1, '모집요강' : 1, '공지' : 1, '주콜러노비타' : 1, '수정' : 1, '한자사전' : 1, '켜기' : 5, '장학금' : 1, '검색등록' : 1, '2013년' : 1, '고전과' : 1, '자세히보기' : 1, '294' : 1, '회생' : 1, '학습' : 1, '20140327' : 1, '이슈분석팬택' : 1, '학회장부학' : 2, '씬마니아' : 1, '고객센터' : 1, '교육목표' : 1, '웹툰' : 2, '4위' : 1, '시작페이지로' : 1, '선택하여' : 1, '투데이' : 1, '실시' : 1, '주의' : 1, '무료로' : 2, '프로그램' : 1, '522' : 1, 'new' : 1, '학부사진겔러리' : 1, '명사들의' : 1, '앱스토어' : 1, '리움' : 1, '카페명' : 1, '최근검색어' : 2, '뉴스스탠드' : 2, '사이즈' : 1, '다음' : 2, '이유는' : 1, '최근검색어에서' : 1, 'TV편성' : 1, '청동기' : 1, '20120909' : 1, '문자받기' : 2, '뉴스' : 4, '후보에' : 1, '흔적' : 1, '완료' : 1, '모집' : 3, '다른' : 1, '활성화되었습니다' : 1, 'MY뉴스' : 1, '공학인증안내' : 1, '개인정보취급방침' : 1, '10주년' : 1, '모든' : 2, 'txt' : 4, '최초설치가' : 1, '다음캐스트' : 1, '게임' : 2, '스포츠' : 5, '사칭한' : 1, '켤' : 1, '자유게시판' : 1, '이미지' : 1, 'Corp' : 1, '재설치' : 1, '사랑받는' : 1, '저녁' : 1, '오류' : 1, '자동완성' : 10, '학생회' : 1, '주요언론사' : 2, '의류' : 1, 'LTE' : 1, '5위' : 1, '이전' : 2, '동화책' : 1, '제대로' : 1, '이적' : 1, 'none' : 1, '그림도' : 1, '캠프' : 1, '소설들' : 1, '컴퓨터시스템응용' : 1, '해피빈' : 1, '검색해' : 1, '고전39을' : 1, 'SK' : 1, '도움말' : 7, '영자지' : 1, '설치된' : 1, '시작되었다' : 1, '한눈에' : 1, 'Chrome' : 1, '이전페이지' : 2, '설치하시겠습니까' : 2, 'kbs온에어' : 2, '선호주제설정' : 1, '탈취악성코드' : 1, '예쁜' : 1, '검색어' : 10, '오랜' : 1, '10년' : 1, '1' : 2, '혹시' : 1, '김유정' : 2, '정책' : 2, '않고' : 1, '스포츠연예' : 1, '우리' : 2, '로그인' : 4, '단일' : 1, '패밀리' : 1, '설계1' : 1, 'SK텔레콤' : 1, '전시' : 1, 'date' : 1, '영어사전' : 1, '알림' : 1, '사실' : 1, '실습조교' : 1, '전문자료' : 1, '유승호' : 2, '노래' : 1, '주세요' : 1, '기사보기' : 1, '39잔인한' : 1, '포스터발표경진대회' : 1, '제휴제안' : 1, '그' : 1, '동화들' : 1, '않습니다' : 2, '명작들' : 1, '1위' : 1, '개인정보' : 2, '전송은' : 1, '컴퓨터스마트IT' : 1, '나만의' : 1, '메인에서' : 1, '있습니다' : 4, '현대' : 1, '포함' : 2, '증권' : 1, '138' : 1, '않은' : 1, '제' : 4, '해야' : 1, '6위' : 1, '신나게' : 1, '주제형캐스트' : 1, '찰스' : 1, '2014' : 2, '앞' : 2, '사진게시판' : 1, '2013' : 1, '대상우수상디아' : 1, 'PC에서' : 1, '컴퓨터HW' : 1, '홈' : 3, '졸업시험' : 1, '자주' : 2, '검색홈' : 1, '다음페이지' : 2, '앱을' : 1, '꺾고' : 1, '빠른' : 1, '채용연계형' : 1, '뮤지컬로' : 1, '계십니다' : 1, '공익나눔' : 1, '구독설정' : 1, '다운로드URL' : 2, '때는' : 1, '20121105' : 1, '번호는' : 1, '디킨스의' : 1, '작품들을' : 1, '완료되지' : 1, '및' : 3, '휴대폰번호' : 1, '인턴십' : 1, 'NAVER' : 1, 'FUN' : 1, '글로벌' : 1, 'TOP100' : 1, '87' : 1, '84' : 2, '전체보기' : 1, '글도' : 1, '북캐스트' : 1, '국내' : 1, '종합경제' : 1, '말도' : 1, '대학원게시판' : 1, '졸업예정자' : 1, '땅' : 1, '자동차테크' : 1, '검색어가' : 1, '설치하세요' : 1, '우리은행' : 1, '오늘의신문' : 1, '소설의' : 4, '신' : 1, '파견키로' : 1, 'times' : 1, 'LG히다찌주' : 1, '레이어' : 4, '부동산' : 1, '수습' : 1, '사전' : 2, '지창욱' : 2, '투병기' : 1, '법' : 1, '시험인증' : 1, '등불' : 1, '익명게시판' : 1, '무료입니다' : 1, '예브게니' : 1, '2' : 1, '약관' : 1, '39교훈' : 1, '찾아보는' : 1, '초월한' : 1, '이택근' : 2, '취업조사2015' : 1, '가볍고' : 1, '사례' : 1, '폰트를' : 1, '득보다' : 1, '취업게시판' : 1, '인물' : 1, '경진대' : 1, 'copy' : 2, '10' : 1, '바로' : 1, '12' : 1, '앤' : 1, '강소라' : 2, '입력' : 1, '취업조사2014' : 1, '찾아오시는길' : 1, '몰락' : 1, '해' : 1, '유형' : 1, '보세요' : 2, '를' : 1, '역대' : 1, '메뉴' : 2, '나눔글꼴' : 8, '고객님의' : 1, '플랫폼' : 1, '갓오브하이스쿨' : 2, '한글캠페인' : 1, '신문' : 5, '언론사별' : 1, '20140924' : 1, '국어사전' : 1, '확인되지' : 2, '회사소개' : 1, '질주' : 1, '가장' : 1, '하이드' : 1, '서식및양식자료실' : 1, '39루돌프39' : 1, '연구자의' : 1, '추가' : 1, '선택' : 1, '책' : 4, '확인' : 1, '기말고사' : 1, '20131210' : 1, '메인을' : 2, '주제별' : 1, '공학인증게시판' : 1, '나눔글꼴을' : 3, '연예' : 1, 'intxt' : 1, 'httpnv1adnavercomadshowunit002ANnrefreshx0' : 1, 'Google' : 2, '나눔글꼴이' : 2, '사이트' : 3, '보기' : 7, '동양과' : 1, '예술의' : 1, '공유가' : 1, '졸업이수요건' : 1, '사용하고' : 1, '03910연승039' : 1, '가' : 1, 'PC에서는' : 1, '동안' : 1, '교감하다' : 1, '보내기' : 1, '오픈캐스트' : 1, '삭제한' : 1, '저장해' : 1, '운석' : 1, '특성화' : 8, '지역' : 2, '마라' : 1, '경시' : 1, '더보기' : 2, '8연승039' : 1, '신고' : 4, '카페글' : 1, '자동차' : 1, '두' : 1, '바로가기' : 5, '방송통신' : 1, '뮤지컬이라는' : 1, '검색어는' : 1, '암각화' : 1, '363' : 1, '대해' : 1, '펼치기' : 1, '영어로' : 1, 'Gmail' : 1, '비극의' : 1, 'C' : 1, '네이버뉴스' : 1, '서비스' : 3, '기능을' : 2, '4대' : 1, '채용' : 2, '주제별캐스트' : 1, '읽을' : 1, '기능이' : 5, '있었던' : 1, '가능합니다' : 2, '지식iN' : 2, '3' : 1, '상승' : 11, '20141031' : 1, '연합뉴스' : 1, '2월' : 1, '나눔글꼴로' : 2, '탄소' : 1, '경진대회' : 1, '로그아웃을' : 1, '새' : 1, '화성' : 1, '일본어사전' : 1, 'TTA' : 1, '카테고리' : 1, '시스템' : 1, '상식' : 1, '20141128' : 1, '7위' : 1, '다운로드' : 2, '북스' : 1, '20141124' : 3, '20141127' : 2, '오네긴' : 1, '앱' : 3, '2015년' : 1, '공지사항' : 2, '긍정부정검색' : 1, '라이프' : 1, '6대학생회' : 2, '꺼져' : 3, '2위' : 1, '컴퓨터공학부' : 5, '위하여' : 1, '네이버를' : 2, '신입직원' : 1, '필요합니다' : 1, '상반기' : 1, '쥬니버' : 1, '주휘닉스디지탈테크' : 1, '통합검색' : 1, 'Beta' : 1, '공학설계' : 2, '507' : 1, '장학제도' : 1, '선거일까지' : 1, '브로셔' : 1, '손흥민' : 1, '사용자가' : 2, '20141203' : 3, 'Googlecom' : 1, '경우에' : 1, '이슈분석유통인들' : 1, '검색' : 2, '한게임' : 1, '전환' : 1, '주는' : 1, '시공' : 1, '2차' : 1, '구독목록' : 1, '안내' : 3, '등' : 1, '다시' : 4, '글이' : 1, '위대한' : 1, '공고' : 1, '신규' : 1, '듣는' : 1, '자리에' : 1, '프로그래밍' : 1, '무대로' : 1, '시간' : 2, 'raquo' : 1, '에이전트' : 1, '찾는' : 1, '8위' : 1, '사용' : 2, '살펴보자' : 1, '9' : 1, '합니다' : 1, '터미네이터5' : 2, '생활위젯' : 1, '카페' : 2, '서양' : 1, '위해서는' : 1, 'IT' : 1, '벌써' : 1, '네이버' : 16, '유산' : 1, '보호를' : 1, '입력하신' : 1, '버튼을' : 1, '전체언론사' : 2, '블로그' : 3, '음악과' : 1, '관객이' : 1, '인권' : 1, '쇼핑' : 2, '아이디로' : 1, '지킬' : 1, '이전캐스트' : 1, '발견' : 1, '끄기' : 7, '매체보기' : 1, '용어사전' : 1, '20141020' : 1, '읽기' : 1, '검색어저장' : 6, '강의자료실' : 1, '석사이상' : 1, '있는' : 1, 'WDO' : 2, '또' : 1, '최대' : 1, '없습니다' : 2, '수' : 2, '컴퓨터' : 1, '인생은' : 1, '개' : 1, '6대' : 1, '배우' : 1, '21GHz' : 1, '까지' : 1, 'YouTube' : 1, '개인' : 2, '닫기' : 5, '4' : 1, '취소' : 2, '동문게시판' : 1, '검색어를' : 2, '개발자' : 1, '공학부' : 1, '내역이' : 1, '인기' : 1, '팬택' : 1, '그림책' : 1, '소설에는' : 1, '60' : 1, 'httpnv2adnavercomadshowunit002APnrefreshx0' : 1, '반드시' : 1, '웹문서' : 1, '소프트웨어' : 1, '매거진전문지' : 1, '9위' : 1, '급상승' : 1, '이유가' : 1, '기업을' : 2, '설정' : 1, '머물지' : 1, '메일' : 1, '지도' : 3, '유포' : 1, '114' : 1, '111' : 1, '영화' : 4, '20131007' : 1, '동영상' : 1, '재탄생' : 4, '현재' : 2, '옷을' : 1, '내PC' : 1, '고전' : 2, '해피투게더' : 3, '내' : 10, '남녀' : 1, 'N드라이브' : 1, '청소년보호정책' : 1, '등록' : 2, 'Play' : 1, '만남' : 1, '기록' : 3, '20141201' : 1, '임의로' : 1, '재보궐선거' : 1, '네이버캐스트' : 1, '삭제' : 4, '12명' : 1, '기존' : 1, '경제' : 1, '열기' : 1, '20141130' : 1, '회화' : 1, '쇼핑캐스트' : 2, '만난' : 1, '교수진' : 1, '명작' : 1, '볼' : 1, '태어난' : 1, '전자랜드' : 1, '지워주세요' : 1, '광고' : 3, '보기위해서는' : 1, 'KOICA' : 1, 'IT융합' : 4, '목' : 1, '공용' : 1, '질문형' : 1, '글꼴설정' : 2, '입시QA' : 1, '사랑39' : 1, '해제' : 1, '어학강좌' : 1, '취업조사2013' : 1, '저장할' : 1, '작품과' : 1, '창의적' : 1, '고심·' : 1, '졸업작품' : 2, '20141014' : 2, '뉴스이슈' : 1, '창작' : 1, '백과사전' : 1, '윤균상' : 2, 'eBook' : 1, '주요뉴스를' : 1, '활성화로' : 1, '발생합니다' : 1, '검색어로' : 1, '본격화…초계기' : 1, '오늘의' : 7, '사원' : 1, '1204' : 1, '20141202' : 3, '컴퓨터SW' : 1, '20141204' : 6, '대학원소개' : 1, '생각한대로' : 1, '클릭하세요' : 1, '미리보기' : 1, '원동력은' : 1, '저장되지' : 1, '음악' : 1, '엇갈린' : 1, '저장' : 2, 'TV' : 1, '강화' : 1, '플랫폼의' : 1, '서재에서' : 1, '실제' : 1, '설정된' : 1, '제공되지' : 1, '추가하시려면' : 1, '전체' : 2, '베스트셀러' : 2, '영영사전' : 1, '고장신고게시판' : 1, '소프트웨어공학' : 1, '않는' : 1, '7월30일' : 1, '이용약관' : 1, '디지털' : 1, '투표' : 1, '오룡호' : 1, '3위' : 1, 'httpstaticnidnavercomloginboxnhn' : 1, '사고' : 1, '연구실소개' : 1, '10위' : 1, '일반자료실' : 1, 'TV캐스트' : 1, '서재' : 1, '인터뷰' : 1, '039홈' : 1, '재미' : 2, } 요구사항 7번 출력 네이버
[풀이]
-Needs1,2 : 생성자 부분에서 가변 인수 형태로 데이터를 받기 때문에 다양한 입력에 대해서 처리할 수 있다. 물론 공백을 입력해도, 공백 리스트로 들어가게 된다.
-Needs3 : addUrl 메소드를 사용하여, 클래스 내 리스트 변수에 삽입했다. 리스트를 상속받아 하기보단, 구성관계에서 하는 것이 유지보수 차원에서 좋다.
-Needs4 : removeURL도 위의 Needs3과 동일하다.
-Needs5 : 클래스내에 저장한 list를 출력하면 된다.
-Needs6 : 지난숙제와 동일하게 정규표현식을 사용하여, 텍스트만 뽑아내고, 단어만을 저장했다. 그러나 매일 유니코드로 나오는 것이 싫어서 새로 출력 함수를 만들어서 이를 통해 출력하도록 했다.
-Needs7 : 지난숙제와 동일하게 리스트형태로 바꾸어, 정렬하도록 했다. 가장 많은 것을 출력하기 위해 정렬 후 가장 큰 값과 비교하여 다를 때까지 원소들을 출력하도록 했다. 여기에서도 url처리를 또하게 된 이유는 frequncy 함수와는 별개로 이 함수가 실행되지 않아도, 가장 큰 값이 뽑아져야 하기 때문이다.
•[8번 문제] 7번 문제에서 정의한 WebWordsFrequency 클래스를 상속하여 OrderedWebWordsFrequency 클래스를 정의하고 슈퍼클래스에 정의된 getWordsFrequency() 메소드를 오버라이드 하여 단어 출현 빈도를 내림 차순으로 정렬하여 리스트로 출력하시오.
◾리스트 내의 각 원소는 단어와 빈도를 쌍으로 지니는 튜플이다.
w4 = OrderedWebWordsFrequency('http://www.daum.net', 'http://www.naver.com', 'http://www.google.co.kr') w4.getWordsFrequency() [('안녕', 12), ('우리', 11), ('다음', 8), ('world', 2), ('hello', 1), ('python', 1)]
# -*- coding: utf-8 -*-
import string
import urllib
import re
class WebWordsFrequency():
def __init__(self, *argv):
self.urlList = list(argv)
self.frequency = dict()
def addUrl(self, urls):
self.urlList.append(urls)
def removeUrl(self, urls):
self.urlList.remove(urls)
def __str__(self):
return str(self.urlList)
def listUrls(self):
for x in self.urlList:
print x
def getMaxFreqencyWords(self):
for x in self.urlList:
self.urlParser(x)
wordList = self.frequency.keys()
s = list()
for word in wordList:
s.append([word, self.frequency[word]])
s.sort(self.mycmp)
maxValue = s[0][1]
i = 0
size = len(s)
while maxValue == s[i][1] and i < size:
print s[i][0]
i+=1
def mycmp(self, a1, a2):
return cmp(a2[1], a1[1])
def myPrint(self, dic):
print '{',
key = dic.keys()
for x in key:
print "'%s' : %s," % (x, dic.get(x)),
print '}'
def getWordsFrequency(self):
for x in self.urlList:
self.urlParser(x)
self.myPrint(self.frequency)
def urlParser(self, URL):
myUrl = urllib.urlopen(URL).read()
myUrl = re.sub('<( )*head([^>])*?>','<head>', myUrl)
myUrl = re.sub('<( )*(/)( )*?head()*>','</head>', myUrl)
myUrl = re.sub('(<head>)[\s\S]*(</head>)',' ', myUrl) ##헤더 제거
myUrl = re.sub('<( )*script([^>])*?>','<script>', myUrl)
myUrl = re.sub('<( )*(/)( )*?script()*>','</script>', myUrl)
myUrl = re.sub('(<script>)([^(<script>\.</script>)])*?(</script>)',' ', myUrl)
myUrl = re.sub('(<script>)[\s\S]*?(</script>)',' ', myUrl) ##스크립트 제거
myUrl = re.sub('<( )*style([^>])*?>','<style>', myUrl)
myUrl = re.sub('<( )*(/)( )*?style()*>','</style>', myUrl)
myUrl = re.sub('(<style>)[\s\S]*?(</style>)',' ', myUrl) ##style(css) 제거
myUrl = re.sub('<( )*object([^>])*?>','<object>', myUrl)
myUrl = re.sub('<( )*(/)( )*?object()*>','</object>', myUrl)
myUrl = re.sub('(<object>)[\s\S]*?(</object>)',' ', myUrl) ##object 제거
myUrl = re.sub('<( )*link([^>])*?>','<link>', myUrl)
myUrl = re.sub('<( )*(/)( )*?link()*>','</link>', myUrl)
myUrl = re.sub('(<link>)[\s\S]*?(</link>)',' ', myUrl) ##link 태그 제거
#태그 자체만 지우는 정규식들
myUrl = re.sub('<( )*span([^>])*?>','<span>', myUrl)
myUrl = re.sub('<( )*(/)( )*?span()*>','</span>', myUrl)
myUrl = re.sub('<( )*div([^>])*?>','<div>', myUrl)
myUrl = re.sub('<( )*(/)( )*?div()*>','</div>', myUrl)
myUrl = re.sub('<( )*ul([^>])*?>','<ul>', myUrl)
myUrl = re.sub('<( )*(/)( )*?ul()*>','</ul>', myUrl)
myUrl = re.sub('<( )*li([^>])*?>','<li>', myUrl)
myUrl = re.sub('<( )*(/)( )*?li()*>','</li>', myUrl)
myUrl = re.sub('<( )*a([^>])*?>','<a>', myUrl)
myUrl = re.sub('<( )*(/)( )*?a()*>','</a>', myUrl)
myUrl = re.sub('<( )*p([^>])*?>','<p>', myUrl)
myUrl = re.sub('<( )*(/)( )*?p()*>','</p>', myUrl)
myUrl = re.sub('<( )*h?([^>])*?>','<h>', myUrl)
myUrl = re.sub('<( )*(/)( )*?h?()*>','</h>', myUrl)
myUrl = re.sub('<( )*time?([^>])*?>','<time>', myUrl)
myUrl = re.sub('<( )*(/)( )*?time()*>','</time>', myUrl) #
myUrl = re.sub('<( )*input([^>])*?>','', myUrl)
myUrl = re.sub('<(ul|image|a|div|span|table|tr|td|li|p|strong|h?|small|footer|html|body|time)>',' ', myUrl)
myUrl = re.sub('</(ul|image|a|div|span|table|tr|td|li|p|strong|h?|small|footer|html|body|time)>',' ', myUrl)
myUrl = re.sub('(°(;)|<(;)|>(;)|"(;)| (;)|&(;)|&lsquo(;)|&rsquo(;)| (;)|&ldquo(;)|&rdquo(;)|&sdot(;))',' ', myUrl) #기타 특수문자 제거
myUrl = re.sub('(\\r){1,20}|(\\n){1,20}|(\\r\\n){1,20}',' ',myUrl) # 개행문자 제거
l1 = myUrl.split() # 스페이스 단위로 단어 찾기.
l2 = []
for x in l1:
word = ''
for w in x:
if w not in string.punctuation: #멤버십 검사
word += w
if len(word) != 0:
try:
l2.append(unicode(word, 'utf-8'))
except:
pass
for x in l2:
if self.frequency.has_key(x):
self.frequency[x] = self.frequency[x] + 1
else:
self.frequency[x] = 1
class OrderedWebWordsFrequency(WebWordsFrequency):
def getWordsFrequency(self):
for x in self.urlList:
self.urlParser(x)
wordList = self.frequency.keys()
s = list()
for word in wordList:
s.append((word, self.frequency[word]))
s.sort(self.mycmp)
print '[',
for x in s:
print "('%s' : %s)," % (x[0], x[1]),
print ']'
w4 = OrderedWebWordsFrequency('http://www.daum.net', 'http://www.naver.com', 'http://www.google.co.kr')
w4.getWordsFrequency()
[ ('상승' : 29), ('바로' : 23), ('내용을' : 22), ('확인하시려면' : 22), ('링크를' : 22), ('전' : 22), ('가져오기' : 22), ('입니다' : 22), ('눌러주세요' : 22), ('제목' : 22), ('페이지' : 15), ('네이버' : 14), ('검색어' : 12), ('바로가기' : 12), ('현재' : 12), ('다음' : 11), ('동영상' : 11), ('자동완성' : 10), ('이전' : 10), ('탭' : 10), ('서비스' : 9), ('오늘의' : 9), ('정보' : 8), ('로그인' : 8), ('나눔글꼴' : 8), ('내' : 8), ('5' : 8), ('뉴스' : 7), ('도움말' : 7), ('끄기' : 7), ('닫기' : 7), ('영화' : 7), ('총' : 7), ('뮤직' : 6), ('스포츠' : 6), ('보기' : 6), ('검색' : 6), ('카페' : 6), ('검색어저장' : 6), ('4' : 6), ('쇼핑' : 6), ('설치' : 5), ('켜기' : 5), ('게임' : 5), ('유승호' : 5), ('있습니다' : 5), ('및' : 5), ('블로그' : 5), ('책' : 5), ('기능이' : 5), ('터미네이터5' : 5), ('지도' : 5), ('광고' : 5), ('지역' : 4), ('삭제' : 4), ('txt' : 4), ('위한' : 4), ('1' : 4), ('레이어' : 4), ('증권' : 4), ('사전' : 4), ('신문' : 4), ('연예' : 4), ('더보기' : 4), ('신고' : 4), ('1위' : 4), ('3' : 4), ('날씨' : 4), ('2위' : 4), ('안내' : 4), ('하락' : 4), ('시간' : 4), ('설정' : 4), ('3위' : 4), ('영상' : 3), ('실시간' : 3), ('링크모음' : 3), ('웹툰' : 3), ('4위' : 3), ('다시' : 3), ('5위' : 3), ('포토' : 3), ('이' : 3), ('김문수' : 3), ('6위' : 3), ('홈' : 3), ('팁' : 3), ('상품' : 3), ('전체보기' : 3), ('7' : 3), ('박민영' : 3), ('뮤지션' : 3), ('당신을' : 3), ('부동산' : 3), ('아고라' : 3), ('추천' : 3), ('copy' : 3), ('음악' : 3), ('나눔글꼴을' : 3), ('스페셜' : 3), ('미즈넷' : 3), ('앱' : 3), ('7위' : 3), ('라이프' : 3), ('꺼져' : 3), ('희망해' : 3), ('8위' : 3), ('개인' : 3), ('인기' : 3), ('9위' : 3), ('이런' : 3), ('기록' : 3), ('원' : 3), ('한' : 3), ('사이트' : 3), ('전체' : 3), ('다음앱' : 3), ('10위' : 3), ('리그' : 3), ('전문보기' : 2), ('라이센스' : 2), ('유익한' : 2), ('진학사어플라이' : 2), ('타임스퀘어' : 2), ('피노키오' : 2), ('임금피크제' : 2), ('무료로' : 2), ('재밌는' : 2), ('고객센터' : 2), ('522' : 2), ('경기' : 2), ('최근검색어' : 2), ('뉴스스탠드' : 2), ('키즈짱' : 2), ('문자받기' : 2), ('디앤샵' : 2), ('완료' : 2), ('찾기' : 2), ('이전페이지' : 2), ('황현주감독' : 2), ('주요언론사' : 2), ('이적' : 2), ('주요' : 2), ('검색등록' : 2), ('Daum' : 2), ('설치하시겠습니까' : 2), ('캐럴' : 2), ('김유정' : 2), ('G마켓' : 2), ('특가' : 2), ('않습니다' : 2), ('개인정보' : 2), ('포함' : 2), ('사용' : 2), ('24' : 2), ('21' : 2), ('23' : 2), ('마일리지' : 2), ('아이디' : 2), ('자주' : 2), ('다음페이지' : 2), ('다운로드URL' : 2), ('FUN' : 2), ('정책' : 2), ('홍진영' : 2), ('성시경' : 2), ('당신의' : 2), ('박태준' : 2), ('약관' : 2), ('tv팟' : 2), ('글꼴설정' : 2), ('이택근' : 2), ('보세요' : 2), ('메뉴' : 2), ('갓오브하이스쿨' : 2), ('확인되지' : 2), ('회사소개' : 2), ('주세요' : 2), ('확인' : 2), ('메인을' : 2), ('이슈' : 2), ('Google' : 2), ('윤진서' : 2), ('나눔글꼴이' : 2), ('비밀번호' : 2), ('지식iN' : 2), ('발목펌핑운동' : 2), ('윤미래' : 2), ('8' : 2), ('미디어' : 2), ('자동차' : 2), ('프로젝트' : 2), ('강소라' : 2), ('펼치기' : 2), ('기능을' : 2), ('가능합니다' : 2), ('전일대비' : 2), ('나눔글꼴로' : 2), ('2352' : 2), ('2353' : 2), ('Makes' : 2), ('다운로드' : 2), ('공지사항' : 2), ('손흥민' : 2), ('사용자가' : 2), ('2014' : 2), ('You' : 2), ('에이전트' : 2), ('영국' : 2), ('보호를' : 2), ('전체언론사' : 2), ('저장' : 2), ('없습니다' : 2), ('수' : 2), ('운세' : 2), ('취소' : 2), ('검색어를' : 2), ('22℃' : 2), ('여주대학교' : 2), ('기업을' : 2), ('메일' : 2), ('모든' : 2), ('GS샵' : 2), ('청소년보호정책' : 2), ('등록' : 2), ('개인정보취급방침' : 2), ('IP보안' : 2), ('쇼핑캐스트' : 2), ('Best' : 2), ('관련' : 2), ('Corp' : 2), ('접근성' : 2), ('에릭남' : 2), ('155' : 2), ('1204' : 2), ('신규진입' : 2), ('TV' : 2), ('방금그곡' : 2), ('조명' : 2), ('사표수리에' : 1), ('것' : 1), ('제공되지' : 1), ('해의' : 1), ('아닌' : 1), ('라인' : 1), ('머리가' : 1), ('자동실행' : 1), ('퍼포머까지' : 1), ('일본어' : 1), ('인기기획전' : 1), ('제안은' : 1), ('아름다운' : 1), ('야구' : 1), ('시스템글꼴' : 1), ('제안' : 1), ('스타드' : 1), ('네이버SE' : 1), ('BWV' : 1), ('부산' : 1), ('39행복의' : 1), ('음식' : 1), ('33℃' : 1), ('리옹' : 1), ('쇼핑도움' : 1), ('쓰는' : 1), ('메인뉴스' : 1), ('건강' : 1), ('완벽한부츠' : 1), ('오픈캐스트' : 1), ('김춘식행정관' : 1), ('까지' : 1), ('사운드' : 1), ('생방송' : 1), ('기다렸어요' : 1), ('내년' : 1), ('가동한다' : 1), ('타이거JK' : 1), ('남자' : 1), ('모양' : 1), ('있어요' : 1), ('강릉' : 1), ('극' : 1), ('심상치' : 1), ('한국' : 1), ('학습' : 1), ('George' : 1), ('환율조작의' : 1), ('좀' : 1), ('Kakao' : 1), ('총격전19명' : 1), ('ㅈㅊ' : 1), ('쇼핑몰' : 1), ('시즌' : 1), ('소개' : 1), ('종결자부터' : 1), ('살림' : 1), ('시작페이지로' : 1), ('선택하여' : 1), ('발라드' : 1), ('인문학' : 1), ('투데이' : 1), ('39벌떼39' : 1), ('Boys' : 1), ('멈췄다' : 1), ('Minor' : 1), ('new' : 1), ('앨범' : 1), ('대립' : 1), ('카페명' : 1), ('온라인' : 1), ('구매도장' : 1), ('뜨끈한' : 1), ('사실' : 1), ('빛으로' : 1), ('100' : 1), ('시' : 1), ('105' : 1), ('밀고' : 1), ('이유는' : 1), ('이방인' : 1), ('구독목록' : 1), ('형제복지원' : 1), ('최근' : 1), ('연말' : 1), ('후보에' : 1), ('글로벌' : 1), ('네이버캐스트' : 1), ('대전' : 1), ('주제별' : 1), ('MY뉴스' : 1), ('화려한' : 1), ('춘천' : 1), ('오늘만' : 1), ('뉴스펀딩' : 1), ('모른척' : 1), ('최초설치가' : 1), ('다우' : 1), ('스토리볼' : 1), ('다음캐스트' : 1), ('39왕좌의' : 1), ('켤' : 1), ('0500' : 1), ('이미지' : 1), ('온스테이지' : 1), ('없다' : 1), ('체험관' : 1), ('재설치' : 1), ('is' : 1), ('저녁' : 1), ('10만적립금도' : 1), ('오류' : 1), ('갑자기추워져' : 1), ('일본과' : 1), ('지워주세요' : 1), ('CJ몰' : 1), ('991176' : 1), ('네이버me' : 1), ('대통령' : 1), ('ㄱㄹ' : 1), ('해피빈' : 1), ('검색해' : 1), ('열린' : 1), ('서강대생들과' : 1), ('SM' : 1), ('위해' : 1), ('Different' : 1), ('설치된' : 1), ('Chrome' : 1), ('택시' : 1), ('TOP' : 1), ('나라는' : 1), ('37도' : 1), ('UP' : 1), ('진짜' : 1), ('신곡' : 1), ('결과' : 1), ('올겨울따뜻해' : 1), ('경우' : 1), ('체첸' : 1), ('어학사전' : 1), ('59℃' : 1), ('이케아조명등' : 1), ('11번가' : 1), ('않고' : 1), ('스포츠연예' : 1), ('널리' : 1), ('A' : 1), ('64℃' : 1), ('고대' : 1), ('137600' : 1), ('가창력' : 1), ('에프엑스의' : 1), ('무대가' : 1), ('date' : 1), ('기다리며' : 1), ('카페글' : 1), ('알림' : 1), ('SSG' : 1), ('안기다려도되' : 1), ('채우는' : 1), ('목록' : 1), ('교수' : 1), ('전문자료' : 1), ('뮤비에서도' : 1), ('볼' : 1), ('배송혜택' : 1), ('제휴제안' : 1), ('노래39' : 1), ('구조장갑' : 1), ('방송통신' : 1), ('What' : 1), ('전송은' : 1), ('신규앱' : 1), ('얼굴도' : 1), ('폭발적반응' : 1), ('나만의' : 1), ('39피노키오39' : 1), ('목숨이' : 1), ('도전하는' : 1), ('이용을' : 1), ('경기전' : 1), ('달렸다' : 1), ('학생' : 1), ('않은' : 1), ('열기' : 1), ('환율' : 1), ('윈터' : 1), ('Backstreet' : 1), ('주제형캐스트' : 1), ('인증방법' : 1), ('39아니야39' : 1), ('청주' : 1), ('메이트의' : 1), ('2013' : 1), ('한자사전' : 1), ('현위치' : 1), ('진행' : 1), ('BORI보리의' : 1), ('상큼한' : 1), ('검색홈' : 1), ('패딩' : 1), ('앱을' : 1), ('반발' : 1), ('산책' : 1), ('인터파크' : 1), ('빠른' : 1), ('로' : 1), ('39압구정백야39' : 1), ('계십니다' : 1), ('공익나눔' : 1), ('내역이' : 1), ('영자지' : 1), ('두둔하며' : 1), ('이메일' : 1), ('듯' : 1), ('때는' : 1), ('시즌5를' : 1), ('번호는' : 1), ('외' : 1), ('클릭상품' : 1), ('후마니타스' : 1), ('만든' : 1), ('완료되지' : 1), ('파격' : 1), ('처음이야' : 1), ('휴대폰번호' : 1), ('ㅁㅂ' : 1), ('금단비' : 1), ('음악들' : 1), ('헬로' : 1), ('경기시간' : 1), ('87' : 1), ('결산' : 1), ('Gershwin' : 1), ('이미' : 1), ('39성추행39' : 1), ('참혹한' : 1), ('받은' : 1), ('국내' : 1), ('종합경제' : 1), ('1655' : 1), ('21110' : 1), ('자동차테크' : 1), ('리그1' : 1), ('검색어가' : 1), ('설치하세요' : 1), ('얼어붙은' : 1), ('11120' : 1), ('자세히보기' : 1), ('사망' : 1), ('공연에' : 1), ('공간' : 1), ('울릉도' : 1), ('온라인세상' : 1), ('파견키로' : 1), ('times' : 1), ('바버렛츠의' : 1), ('아우터걱정끝' : 1), ('수습' : 1), ('대' : 1), ('지창욱' : 1), ('옥션' : 1), ('하프클럽' : 1), ('아웃도어' : 1), ('광주' : 1), ('Partita' : 1), ('13℃' : 1), ('무료입니다' : 1), ('매체보기' : 1), ('사용해' : 1), ('2' : 1), ('세상을' : 1), ('이주향의' : 1), ('느낌' : 1), ('차트를' : 1), ('PC에서' : 1), ('한화' : 1), ('가볍고' : 1), ('폰트를' : 1), ('지금' : 1), ('밤하늘의' : 1), ('39한음파39' : 1), ('인물' : 1), ('Beautiful' : 1), ('랭스' : 1), ('12' : 1), ('14' : 1), ('02℃' : 1), ('입력' : 1), ('Courante' : 1), ('몰라' : 1), ('나라39' : 1), ('해' : 1), ('선정' : 1), ('웹' : 1), ('를' : 1), ('생중계' : 1), ('알려진' : 1), ('생생' : 1), ('Gmail' : 1), ('뮤직홈' : 1), ('Percussion' : 1), ('밤과' : 1), ('회원가입' : 1), ('한글캠페인' : 1), ('찾는' : 1), ('소호' : 1), ('국어사전' : 1), ('클라우드' : 1), ('15개' : 1), ('나스닥' : 1), ('롯데닷컴' : 1), ('이건꼭사야돼' : 1), ('만에' : 1), ('기사보기' : 1), ('차별과' : 1), ('역주행' : 1), ('1788125' : 1), ('선택' : 1), ('체험학습' : 1), ('기대감' : 1), ('72' : 1), ('그' : 1), ('손난로' : 1), ('발견' : 1), ('정윤회' : 1), ('78' : 1), ('httpnv1adnavercomadshowunit002ANnrefreshx0' : 1), ('솔로' : 1), ('AK몰' : 1), ('외에도' : 1), ('전주' : 1), ('오늘' : 1), ('사용하고' : 1), ('포크' : 1), ('기구' : 1), ('가' : 1), ('마지막' : 1), ('PC에서는' : 1), ('보내기' : 1), ('50℃' : 1), ('삭제한' : 1), ('베스트홈' : 1), ('뉴스이슈' : 1), ('친형' : 1), ('체험해보세요' : 1), ('명품백도사고' : 1), ('바꾸는' : 1), ('갖고' : 1), ('강타한' : 1), ('6003' : 1), ('패밀리' : 1), ('종료' : 1), ('정말' : 1), ('결혼' : 1), ('you39' : 1), ('문자' : 1), ('인재채용' : 1), ('11' : 1), ('10' : 1), ('메인에서' : 1), ('선율' : 1), ('귀를' : 1), ('제3편' : 1), ('지나도' : 1), ('황반변성이란' : 1), ('이주의' : 1), ('X' : 1), ('검색어는' : 1), ('웹접근성안내' : 1), ('서두르세요' : 1), ('분통터지는' : 1), ('쇼핑홈' : 1), ('권진아' : 1), ('중' : 1), ('대구' : 1), ('826III' : 1), ('miles' : 1), ('대해' : 1), ('영어로' : 1), ('앱스토어' : 1), ('중계센터' : 1), ('풀' : 1), ('가능한건가' : 1), ('게임39' : 1), ('서비스약관' : 1), ('사람' : 1), ('316' : 1), ('SSGcom' : 1), ('39올' : 1), ('네이버뉴스' : 1), ('나의' : 1), ('찌릿' : 1), ('부모들' : 1), ('음원차트' : 1), ('유지' : 1), ('138' : 1), ('주제별캐스트' : 1), ('주요뉴스를' : 1), ('미시옷' : 1), ('찢어진' : 1), ('통합' : 1), ('수도서' : 1), ('연합뉴스' : 1), ('C' : 1), ('운동' : 1), ('로그아웃을' : 1), ('새' : 1), ('유형' : 1), ('도움말보기' : 1), ('티저' : 1), ('이종석' : 1), ('카테고리' : 1), ('주가검색' : 1), ('운전자' : 1), ('들어요' : 1), ('북스' : 1), ('새벽' : 1), ('돌풍' : 1), ('플래닛' : 1), ('훈훈한' : 1), ('범행현장' : 1), ('죽은' : 1), ('브랜드' : 1), ('477132' : 1), ('영어사전' : 1), ('일본어사전' : 1), ('7만원대득템' : 1), ('부부' : 1), ('생활' : 1), ('670008' : 1), ('NAVER' : 1), ('러시아' : 1), ('위하여' : 1), ('제휴문의' : 1), ('있었다' : 1), ('252' : 1), ('싶다' : 1), ('뚝' : 1), ('2만원대' : 1), ('필요합니다' : 1), ('상반기' : 1), ('임의로' : 1), ('엠버' : 1), ('한대수' : 1), ('통합검색' : 1), ('배바지에' : 1), ('Beta' : 1), ('폰번호' : 1), ('507' : 1), ('한파주의보' : 1), ('주니' : 1), ('강타하는' : 1), ('Googlecom' : 1), ('준비' : 1), ('thousand' : 1), ('완벽소화' : 1), ('한게임' : 1), ('최근검색어에서' : 1), ('추위걱정' : 1), ('패대기' : 1), ('티스토리' : 1), ('곡' : 1), ('12℃' : 1), ('고객님의' : 1), ('TV편성' : 1), ('등' : 1), ('none' : 1), ('IT' : 1), ('선호주제설정' : 1), ('신규' : 1), ('듣는' : 1), ('공개' : 1), ('기억하세요' : 1), ('나와' : 1), ('공감' : 1), ('휴식' : 1), ('in' : 1), ('영하' : 1), ('인테리어' : 1), ('흔한' : 1), ('raquo' : 1), ('미리보기' : 1), ('제주' : 1), ('응원합니다' : 1), ('tv팟홈' : 1), ('올겨울따뜻' : 1), ('컬처스' : 1), ('컬럼비아다운' : 1), ('오늘의신문' : 1), ('아이' : 1), ('합니다' : 1), ('VA' : 1), ('생활위젯' : 1), ('39위아래39' : 1), ('기회' : 1), ('환상' : 1), ('위해서는' : 1), ('경기성장' : 1), ('헐' : 1), ('이게' : 1), ('올림피크' : 1), ('김성근표' : 1), ('입력하신' : 1), ('버튼을' : 1), ('김민희' : 1), ('예고' : 1), ('10초' : 1), ('90년대' : 1), ('검색쇼' : 1), ('63darr' : 1), ('현대H몰' : 1), ('정절' : 1), ('이전캐스트' : 1), ('intxt' : 1), ('39힐링' : 1), ('긍정부정검색' : 1), ('용어사전' : 1), ('만화속세상' : 1), ('감상회' : 1), ('심형탁에' : 1), ('최대' : 1), ('초대' : 1), ('개' : 1), ('펜던트' : 1), ('없어요' : 1), ('롱코트도' : 1), ('YouTube' : 1), ('찬' : 1), ('활성화되었습니다' : 1), ('설정된' : 1), ('킴의' : 1), ('39올리' : 1), ('날짜' : 1), ('httpnv2adnavercomadshowunit002APnrefreshx0' : 1), ('4집' : 1), ('이마트몰' : 1), ('3137' : 1), ('제대' : 1), ('구독설정' : 1), ('아빠의' : 1), ('캐치맙' : 1), ('반드시' : 1), ('웹문서' : 1), ('매거진전문지' : 1), ('프로방스' : 1), ('급상승' : 1), ('이유' : 1), ('대입' : 1), ('캐럴을' : 1), ('EBS지식' : 1), ('50' : 1), ('114' : 1), ('본인확인' : 1), ('111' : 1), ('너란' : 1), ('재탄생' : 1), ('영상은' : 1), ('뉴스홈' : 1), ('그때' : 1), ('Cuba' : 1), ('네이버를' : 1), ('피해자들' : 1), ('명곡' : 1), ('OST' : 1), ('핫한' : 1), ('제대로' : 1), ('2014년' : 1), ('가수들이' : 1), ('N드라이브' : 1), ('루리웹' : 1), ('ㅅㅇ' : 1), ('Play' : 1), ('쥬니버' : 1), ('재보궐선거' : 1), ('iSTYLE24' : 1), ('드' : 1), ('꿈에' : 1), ('광고안내' : 1), ('소낙눈끝' : 1), ('기존' : 1), ('경제' : 1), ('언론사별' : 1), ('48℃' : 1), ('서울' : 1), ('회화' : 1), ('다짐' : 1), ('잠정' : 1), ('케미' : 1), ('or' : 1), ('윤도현' : 1), ('황영희' : 1), ('동남구' : 1), ('No' : 1), ('천안시' : 1), ('음악39' : 1), ('장벽' : 1), ('보기위해서는' : 1), ('열정樂서' : 1), ('알바만을' : 1), ('별빛' : 1), ('달아요' : 1), ('귀환' : 1), ('김우빈' : 1), ('KBS특선' : 1), ('PLAYLIST' : 1), ('39Love' : 1), ('지식공간' : 1), ('목' : 1), ('SALE' : 1), ('롯데i몰' : 1), ('금융' : 1), ('Perahia' : 1), ('공용' : 1), ('질문형' : 1), ('감기에' : 1), ('해제' : 1), ('저장할' : 1), ('음감회' : 1), ('생각' : 1), ('저장해' : 1), ('패션플러스' : 1), ('PC에서만' : 1), ('백과사전' : 1), ('EXID' : 1), ('ㅋㅎ' : 1), ('Murray' : 1), ('선거일까지' : 1), ('독일' : 1), ('머스39의' : 1), ('MAMA' : 1), ('백령도' : 1), ('발생합니다' : 1), ('검색어로' : 1), ('본격화…초계기' : 1), ('42℃' : 1), ('칼바람추위속' : 1), ('신세계몰' : 1), ('해야' : 1), ('Summertime' : 1), ('생각한대로' : 1), ('없는' : 1), ('클릭하세요' : 1), ('사실이다' : 1), ('팍팍해진' : 1), ('청소년유해매체물' : 1), ('저장되지' : 1), ('좋은' : 1), ('경우에' : 1), ('로드뷰' : 1), ('터틀넥필수' : 1), ('고구마' : 1), ('5070이벤트' : 1), ('추가하시려면' : 1), ('증시' : 1), ('않다' : 1), ('모바일' : 1), ('30년' : 1), ('영영사전' : 1), ('내또래' : 1), ('품절임박특가' : 1), ('있던' : 1), ('AD' : 1), ('않는' : 1), ('7월30일' : 1), ('진짜인' : 1), ('이용약관' : 1), ('찌릿한데' : 1), ('내PC' : 1), ('오룡호' : 1), ('39Angel39' : 1), ('httpstaticnidnavercomloginboxnhn' : 1), ('사고' : 1), ('04℃' : 1), ('티저부터' : 1), ('보호격벽' : 1), ('TV캐스트' : 1), ('미' : 1), ('스타쉽' : 1), ]
[풀이]
문제 7의 요구사항 7번과 동일한 알고리즘을 활용하는 대신 튜플로 저장한뒤 정렬한다. 단 이부분도 유니코드로 나오는 문제를 해결하기 위해 다음과 같이 새로운 string 출력 함수를 제작하여 출력하도록 했다.
[소감] 파이썬에 대해서 많이 배우게 되었고, 이를 활용할 수 있는 기회가 되서 좋았다.
자 그럼 이제 시작하도록 하겠습니다.
순서
1. HTML 데이터를 받아옵니다.
2. <body> 데이터만 가져옵니다.
3. <script> 데이터 삭제합니다.
4. <img> 태그만 가져옵니다.
5. 가져온 태그를 이용하여 메인 이미지를 추출한다.
> 추출하는 것에 대해 이미지 크기가 큰걸로 추출하려고 합니다.
이미지 추출의 경우.
위와 같은 순서로 진행을 하려고 했지만 , 제 능력이 되지 않아. 메타태그의 이미지를 가져오는 것으로 돌아갔습니다.
시간내에 맞춰야하는 부분도 있고, 알고리즘 공부도 아에 안할 수가 없는게 핑계라면 핑계입니다.
없는 기사들에 대해서는 저희 로고를 가운데 박아서 띄워주는 것으로 처리하였습니다.
다음과 같은 결과물을 얻을 수 있었습니다.
시간이된다면, 정규식을 통해 정리해놓은 img 태그에서 feature 이미지를 추출하는 부분을 진행해볼 예정입니다.
'Projects > TJSSM' 카테고리의 다른 글
[단기] 05. 테스트 및 버그 수정 (0) | 2015.02.11 |
---|---|
[단기] 05. 서버 이관 작업 (0) | 2015.02.11 |
[단기] 03. Chrome Extension 과 Facebook API (0) | 2015.02.05 |
[단기] 02. 환경구축 (0) | 2015.02.01 |
[단기] 01.시작 (0) | 2015.01.24 |