연재/Project Jarvis

간단한 Naver Endic(영어사전) 파싱 예제

Readiz 2016. 2. 28. 21:28


네이버 영어사전 파싱 예제



  예전부터 써왔던 BeautifulSoup을 사용해서 파싱해본 예제입니다. 전통적으로 데스크탑 웹보다 모바일 웹이 파싱하기 간단해서 모바일 웹으로 파싱하였습니다. Telegram Bot과 연동시킨 예제인데, 사용해보실 분은 사용해도 괜찮을 듯 합니다. (덧. 요즘은 Scrapy라는 툴이 더 강력한듯 한데.. 이번 주말에는 손대보지 못했네요. 이게 더 좋다면 BeautifulSoup에서 갈아타는게 나을듯 한데..)




parse_naver_endic 함수


	
def parse_naverendic_section(card):
    resulttext = '';
    head = card.find_all('a', attrs={'class': 'h_word'})
    body = card.find_all('ul', attrs={'class': 'desc_lst'})

    if len(head) >= 1:
        resulttext += "<b>"
        resulttext += head[0].get_text(' ', strip=True)
        resulttext += "</b>\n"
    if len(body) >= 1:
        meaninglist = body[0].findAll('li')
        for item in meaninglist:
            resulttext += item.text.strip()
            resulttext += "\n"
            
    return resulttext 
	



Telegram Interface 부분 및 결과출력 부분


	
if getSearchMode(chat_id) == 0:
    try:
        url = 'http://m.endic.naver.com/search.nhn?searchOption=entryIdiom&query=' + text.encode('utf-8')
        url = urllib.quote(url, '/:?=&')
        resp = urllib2.urlopen(url).read()
        soup = BeautifulSoup(resp, "html.parser")
        target = soup.find_all('div', attrs={'class':'section_card'})

        if len(target) >= 1:
            tmp = ''
            i = 0
            for item in target:
                tmp += parse_naverendic_section(item)
                tmp += '\n'
                i += 1
                if i >=3:
                    break
            bot_reply('<b>[Naver Endic]</b>\n' + tmp, enablereply=0)

        else:
            bot_reply('No result in endic') 
	



결과 출력




  저같은 경우에는 찾은 뒤 개인 사전에도 저장이 되게 해두었는데.. 이런 식으로 활용하시면 도움이 될 듯 하네요. Naver가 Endic의 경우에는 다행히도 Bot임을 체크하지 않아서 평범하게 파싱해도 되는데, 네이버 메인검색결과를 API없이 Parsing하려면 우회가 필요하더군요. 간단한 예제이지만 도움이 되시길 바라면서 오늘 이야기는 여기서 끝!