본문 바로가기
Python

[ Python ] py-hanspell 맞춤법 검사기 오류 ( result 오류, json.loads 에러 )

by YBin's 2024. 11. 6.

설치

pip install git+https://github.com/ssut/py-hanspell.git

 

테스트 코드 수행

from hanspell import spell_checker

# 맞춤법 검사할 텍스트를 입력하세용
text = "안녕 하세요. 만나서 반갑 습니다."

try:
    # 맞춤법 검사 수행하는 메소드
    result = spell_checker.check(text)
    
    print("Checked Text:", result.checked)  # 수정된 텍스트
    print("Original Text:", result.original)  # 원본 텍스트
    print("Errors Found:", result.errors)  # 발견된 오류 수
    print("Corrections:", result.words)  # 각 단어의 교정 결과

except Exception as e:
    print("Error occurred:", e)

 

이런! result가 없는 에러 발생..

문제 파악

  • 라이브러리를 뜯어서 어느 URL로 요청하는지 파악 ( Lib/site-packages/hanspell/constants.py )

해당 URL로 요청

  • 요청 URL을 접속해보자.

  • 엥? 갑자기 키를 찾는다?? 바로 네이버 맞춤법 검사기로 이동해보자.

  • 이렇게 맞춤법검사기를 들어가서, F12 -> Network 탭을 누른 후, 아무 텍스트나 입력하고 검사하기를 눌러본다.

  • 그럼 이렇게 확인할 수 있다. url을 보니 passportKey와 _callback이 더 있다.. callback은 아마 naver측에서 붙이는 것이므로 잠시 재껴두고 passportKey에 집중해보자. 결국, url을 요청할 떄, 저 key를 넣어주어야 한다는 것이다.
    url = "https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=네이버+맞춤법+검사기"
    res = requests.get(url)

    html_text = res.text

    match = re.search(r'passportKey=([^&"}]+)', html_text)
    if match:
        passport_key = match.group(1)
        print(passport_key)
        return passport_key
    else:
        return False

 

간단하게 코드를 작성해보고 찍어보면..

  • 이제 해당 passport_key를 url 요청할 때 같이 넘겨주어야 한다. 아까 라이브러리 끄쩍이던 폴더에 들어가서 spell_checker.py를 들어간다.

 

  • 이렇게 인자로 passportKey를 추가로 받도록 수정한다. ( 원래는 text만 받습니다 )

 

  • 아래쪽에 payload에 passportKey를 같이 보내도록 코드를 수정한다.
  • 그리고 check를 보낼 때, passportKey를 같이 보내도록 코드를 수정하고 요청해보면..!!!!
from hanspell import spell_checker

# 맞춤법 검사할 텍스트를 입력하세용
text = "안녕 하세요. 만나서 반갑 습니다."

try:
    passportKey = get_passport_key()
    # 맞춤법 검사 수행하는 메소드
    result = spell_checker.check(text, passportKey)
    
    print("Checked Text:", result.checked)  # 수정된 텍스트
    print("Original Text:", result.original)  # 원본 텍스트
    print("Errors Found:", result.errors)  # 발견된 오류 수
    print("Corrections:", result.words)  # 각 단어의 교정 결과

except Exception as e:
    print("Error occurred:", e)

또! 문제 발생

  • 위의 과정을 거치고 나니,

  • 이러한 에러가 생겼다. 이는 json.loads에서 주로 생기는 에러라고 한다.

Library 수정-2

  • 코드를 찾아보니 이녀석이 하나 있다.
  • 단순히 json.loads의 에러인지, 아니면 맞춤법 검사 요청 자체가 실패한건지 확인하기 위해 r.text의 값을 찍어보면..

  • 값은 잘 넘어오고있는 것을 확인할 수 있다.
  • 형태를 보아 콜백함수로 감쌓여 있는 형태인, JSONP이다. 아마 형태가 달라서 에러가 나는 듯 하다.

해결

  • JSONP형태를 정규화를 통해 해제하고 넘겨보면..!!

  • 이렇게 정상적으로 작동되는 모습을 확인할 수 있다.

 

참고 사이트

https://github.com/ssut/py-hanspell/issues/41

 

py-hanspell spell_checker.check 사용 시 KeyError: 'result' · Issue #41 · ssut/py-hanspell

안녕하세요. chec = spell_checker.check() 사용 시 KeyError: 'result'가 반환됩니다. hanspell\spell_checker.py 내 line 62 에서 html = data['message']['result']['html'] 부분 중 ['result'] 부분에서 keyerror가 발생한 것 같습니다.

github.com

https://github.com/ssut/py-hanspell/issues/48

 

KeyError: Result 에러 해결 방법을 좀 더 간편하게 수정해 보았습니다. · Issue #48 · ssut/py-hanspell

초기에는 issue #47 해결방법을 적용하신 뒤 이후 매일 변경되는 passportKey에 대해서 아래와 같이 코드를 사용하면 번거롭게 매번 passportKey를 수동으로 변경하지 않으셔도 될 것 같아 공유드립니다.

github.com