"""네이버 검색 API 유틸리티"""
import urllib.request
import urllib.parse
import xml.etree.ElementTree as ET
from typing import List, Dict
import re
import os
from dotenv import load_dotenv
load_dotenv()
# 네이버 API 인증 정보
NAVER_CLIENT_ID = os.getenv("NAVER_CLIENT_ID")
NAVER_CLIENT_SECRET = os.getenv("NAVER_CLIENT_SECRET")
def search_naver(query: str) -> List[Dict[str, str]]:
"""
네이버 검색 API를 사용하여 검색 결과 가져오기
Args:
query: 검색 질문
Returns:
검색 결과 리스트 [{"title": "", "link": "", "description": ""}]
"""
enc_text = urllib.parse.quote(query)
display = 10 # 검색 결과 개수
url = f"https://openapi.naver.com/v1/search/webkr.xml?query={enc_text}&display={display}"
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id", NAVER_CLIENT_ID)
request.add_header("X-Naver-Client-Secret", NAVER_CLIENT_SECRET)
response = urllib.request.urlopen(request)
rescode = response.getcode()
results = []
if rescode == 200:
response_body = response.read()
xml_data = response_body.decode('utf-8')
# XML 파싱
root = ET.fromstring(xml_data)
for item in root.findall('.//item'):
title = item.find('title').text if item.find('title') is not None else ""
link = item.find('link').text if item.find('link') is not None else ""
description = item.find('description').text if item.find('description') is not None else ""
# HTML 태그 제거
title = re.sub(r'<[^>]+>', '', title) # 모든 HTML 태그 제거
description = re.sub(r'<[^>]+>', '', description)
# HTML 엔티티 디코딩
title = title.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace(''', "'")
description = description.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace(''', "'")
results.append({
"title": title,
"link": link
#"description": description
})
return results