엑셀에서 네이버사전 가져오기


노가다 자동화

지난 프로젝트에서 이런 일이 있었습니다.
기존 레거시 시스템을 분석해서 설계서의 도움말을 작성하는 것이였는데요.

개발자들이 모여서 한일이 뭐냐하면..
기존 시스템의 도움말 버튼을 클릭하여 새창이 뜨면 도움말 부분을 복사하여 화면별 워드 파일에 붙여넣기를 하였습니다.
다들 그렇게 노가다를 시작했는데요.

확인해 보니 도움말은 html로 되어 있었고, 패턴이 보이더군요.
도움말 url은 화면을 구성하는 파일명을 사용하고 있구요.

그래서 저는 이 작업을 아래와 같이 자동화 하였습니다.

  1. 엑셀에 화면의 파일명 목록을 작성
  2. 파일명에 해당하는 도움말 html을 가져와서 파싱하여 엑셀에 기록
  3. 엑셀에 기타 필요한 정보 작성
  4. 워드의 편지병합 기능을 사용하여, 파일별 설계서 작성

결론은 10명의 인원이 일주일 정도 할 작업을 혼자서 하루만에 끝낼 수 있었습니다.
(생성된 워드 파일들을 다시 검수해서 추가 기술하는 것은 제외하구요)

네이버사전 분석

아래의 vba 코드는 html을 분석하여 엑셀에 자동으로 입력해 주는 내용으로
네이버 사전을 분석하는 내용입니다.
이를 참고하면 비슷한 작업을 하실때 도움이 될듯합니다.

vba를 통해 매크로 실행시 아래와 같이 네이버 사전 내용을 가져옵니다.
vba 코드를 수정하려면 alt+f11
vba 코드를 실행하려면 A열의 셀에서 alt+f8 을 누르시면 됩니다.

excel_naver_dic

참고로 vba에서 아래와 같이 3개를 참조추가하셔야 정상적으로 실행됩니다.

excel_refrence

 

File Download

vba 코드

'도구 > 참조 :
'   Microsoft ActiveX Data Objects x.x Library
'   Microsoft XML, v3.0
'   Microsoft VBScript Regular Expressions


Sub ParseHelp()
    ' 네이버 사전 URL 생성
    Dim Url As String
    Url = "http://m.endic.naver.com/search.nhn?searchOption=entryIdiom&query=" & Cells(ActiveCell.Row, "A").Value
    
    ' 사전 HTML 가져오기
    Dim Html As String
    Html = GetHtml(Url)
    
    ' 오류 체크
    If InStr(Html, "<TITLE>Not Found</Title>") > 0 Then
        MsgBox "404"
        Exit Sub
    End If
    
    ' HTML에서 사전 내용만 정규식으로 가져오기
    Dim pat As String
    pat = "<ul class=""desc_lst"">(.*?)</ul>"
    
    ' 첫번째 패턴매칭 결과를 셀에 기록
    Dim result As String
    Set coll = FindRegexpMatch(Html, pat)
    If Not coll Is Nothing Then
    
        'For Each o In coll
        '    result = result & Chr(10) & Chr(13) & StripHtml(CStr(o))
        'Next o
        
        result = StripHtml(CStr(coll(1)))
        Cells(ActiveCell.Row, "B").Value = result
    Else
        MsgBox "not found"
    End If
End Sub


Public Function StripHtml(Html As String) As String
    Dim RegEx As New RegExp
    Dim sOut As String
    
    Html = Replace(Html, "</li>", vbNewLine)
    Html = Replace(Html, "&nbsp;", " ")
    
    With RegEx
        .Global = True
        .IgnoreCase = True
        .MultiLine = True
        .Pattern = "<[^>]+>"
    End With
    
    sOut = RegEx.Replace(Html, "")
    StripHtml = sOut
    Set RegEx = Nothing
End Function


Public Function GetHtml(Url As String) As String
    Dim request As New MSXML2.XMLHTTP
    Dim converter As New ADODB.stream
    
    ' 가져오기
    request.Open "GET", Url, False
    request.send
    
    ' raw bytes를 스트림에 쓰기
    converter.Open
    converter.Type = adTypeBinary
    converter.Write request.responseBody
    
    ' 스트림에서 글자 읽기
    converter.Position = 0
    converter.Type = adTypeText
    converter.Charset = "utf-8"
    
    ' 스트림 닫고, 리턴
    GetHtml = converter.ReadText
    converter.Close

End Function


Public Function FindRegexpMatch(txt As String, pat As String) As Collection
    Set FindRegexpMatch = New Collection
    
    Dim rx As New RegExp
    Dim matcol As MatchCollection
    Dim mat As Match
    Dim ret As String
    Dim delimiter As String
    
    txt = Replace(txt, Chr(10), "")
    txt = Replace(txt, Chr(13), "")
    
    rx.Global = True
    rx.IgnoreCase = True
    rx.MultiLine = True
    rx.Pattern = pat
    Set matcol = rx.Execute(txt)
    
    For Each mat In matcol
        FindRegexpMatch.Add mat.SubMatches(0)
        'FindRegexpMatch.Add mat.Value
    Next mat
    
    Set rx = Nothing
End Function

 

광고

28개의 댓글

  1. 안녕 하세요. 이걸 스페인어로 변경 하고 싶어서요. 아무리 해도 오류만 나오네요. 네이버 사전 주소만 바꾸면 메크로가 돌아 갈거라고 생각 했었는데 그게 안되네요. 혹시 무엇을 더 수정해야 하는지 알려주실 수 있나요?
    감사합니다.

    • 해당 코드는 네이버 사전에 html 요청후 응답값을 해석하여 필요한값만 추려내는 방식입니다.
      응답값(html)이 영어와 스페인어 사전이 달라서 24번줄의 패턴 정규식도 변경해야 합니다.
      시간이 없어서 대략 확인해 보니 아래와 같이 작성하면 동작할 듯합니다.
      정상적인 동작을 위해서는 응답값을 분석해서 오류처리까지 하셔야 합니다.

      10줄 : Url = "http://m.spdic.naver.com/m/search.nhn?range=entry&query=" & Cells(ActiveCell.Row, "A").Value
      24줄 : pat = "(.*?)"

  2. 검색하다 우연히 들렀습니다. 정말 기발한 아이디어네요 +_+ 궁금한게 있는 데 혹시 발음 기호가 아니라 발음 음원을 재생하는 것도 가능한가요? 예를 들어 단어를 선택하고 재생을 누르면 네이버에서 검색한 단어의 발음 재생을 누르는 것과 같은 효과를 낸다든가 아니면 링크가 자동 생성되서 바로 재생 된다든가...제가 설명을 잘 못하겠네요;;

  3. 제가 찾던 내용이 여기에 있었네요. 저는 프랑스어 사전을 연동하고 싶은데 혹시 방법이 없을까요?
    10줄 : Url = "http://m.frdic.naver.com/#/search?query=" & Cells(ActiveCell.Row, "A").Value
    24줄 : pat = "

    (.*?)

    "

    로 바꿔봤는데 값이 나오질 않더라구요. 정말 필요한데 혹시 확인 해주실 수 있나요?

  4. 만들어주신거 정말 잘 쓰고 있었는데 갑자기 '프로시저 호출 또는 인수가 잘못 되었습니다.' 이렇게 뜨더니 안되네요ㅠㅠ 이제 사용 안되는 걸까요?

    • 답변이 늦었습니다.
      네이버 의존성이 있는 코드라서 지속적으로 수정하며 답변드리기는 힘들듯합니다.
      이 포스트는 이런것도 있구나 하는 정도로 봐주시면 감사하겠습니다.

  5. 저랑 같으시군요. 저도 오늘 갑자기 '개체 사용 권한이 없습니다.' 라고 뜨면서 실행이 안되네요. 네이버에서 막은 걸까요?

    • 답변이 늦었습니다.
      네이버 의존성이 있는 코드라서 지속적으로 수정하며 답변드리기는 힘들듯합니다.
      이 포스트는 이런것도 있구나 하는 정도로 봐주시면 감사하겠습니다.

  6. ^^ 완전 대박입니다.
    이런 능력자님의 글을 읽게 되다니 영광입니다.

    네이버의 사전을 불러오는 방식에서 기존에 가지고 있는 동의어 모음에서 동의어를 표현할 수 있는 코드를 열심히 연습하며 준비하고 있습니다.

    나중에 KIMSTAR님에게 도움을 받을 수 있으면 좋겠습니다.

    여러모로 많은 아이디어를 제공해 주셔서 감사합니다 ^^

  7. https://dict.naver.com/hbokodict/ancienthebrew/#/main
    https://dict.naver.com/grckodict/ancientgreek/#/main

    안녕하세요? 공부를 하는 데 고대 히브리어/그리스 사전이 필요합니다.
    네이버가 한글로 잘 정리되어 있더군요
    그런데 전파가 잘 안되는 곳에서 보는 경우가 많아서 엑셀로 다운받아서 찾아보면 정말 편할 듯합니다.

    혹시 히브리어, 그리스어에 관련된 정규식도 알아봐주실 수 있는지요?

    올려주신 글보고 도전해보겠습니다.

    감사합니다

    • 당시에 시간이 되면 도움을 드릴 수 있는지 검토해 봐야겠다고 생각만 하고 잊고 있었네요.
      엄청 늦게 답변 드려서 죄송합니다.

댓글 남기기