얼마 전 올린 포스팅은 Python 앱에서 sitemap을 생성하여 검색엔진의 사이트맵에 등록하는 것이었습니다.

관련 링크 >
https://webisfree.com/2020-08-17/python에서-xml-사이트맵-페이지-만들기

그런데 구글 웹마스터와 달리 네이버 서치 어드바이서의 경우 sitemap 등록시 에러가 발생했습니다. 에러 문구는 특정 라인에서 에러가 발생된다는 점입니다.


! Jinja2를 사용한 방법
(업데이트) Jinja2의 필터를 사용한 방법으로 sitemap 등록 에러를 수정한 방법입니다. python 코드의 수정 없이 jinja2 템플릿 수정만으로 네이버 서치 어드바이서에 정상 등록되었습니다. jinja2 코드는 아래와 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  {% for item in myArticles %}
    <url>
      <loc>{{ item.link_url | urlencode }}</loc>
      <lastmod>{{ item.created }}</lastmod>
    </url>
  {% endfor %}
</urlset>

python에서 해당 템플릿 파일에 myArticles로 리스트를 전달합니다. 이때 jinja2 템플릿에서는 주소를 출력할 때 아래와 같이 urlencode 필터를 사용합니다.
      <loc>{{ item.link_url | urlencode }}</loc>

이렇게 적용 후 네이버 검색엔진의 사이트 어드바이서에 등록합니다. 이 전과 달리 정상 동작하였습니다.

참고로 구글 search console, naver의 search advisor 모두 문제가 없었다면 위와 같은 인코딩이 따로 필요하지 않을 수 있습니다. 테스트 사이트맵의 경우 url에 특수문자가 포함되어 있었으며 이런 부분이 문제가 되었습니다.


! 네이버 서치 어드바이서 sitemap 에러 해결하기
원인은 여러가지 있겠지만 이미 다른 검색엔진에서 잘 동작하는 sitemap이였고 특정 라인에서만 문제가 있어 확인해보니 주소쪽에 문제가 있었습니다. 결국 원인은 검색엔진에서 sitemap url 파싱 차이라고 판단했습니다.

원인 해결을 위해서는 url을 한 번 더 인코딩(encode)이 필요하다고 생각했고 python에서 주소 인코딩 방법 중 아래의 내장 함수를 사용하기로 결정했습니다.

urllib.parse.quote(문자열)


주소를 저장한 필드의 값을 가져와 인코딩 후 다시 저장하여 해결하려고 했습니다. 아래는 작성된 코드의 일부입니다.
@application.route('/sitemap.xml')
def web_sitemap():
  results = db.myCollection.find().sort([('created', -1)]).limit(500)
  items_list = []
  for result in results:
    result['pathname'] = urllib.parse.quote(result['pathname'])
    items_list.append(result)

  sitemap_xml = render_template('sitemap.html', myList=json.loads(toJson(items_list )))
  response = make_response(sitemap_xml)
  response.headers['Content-Type'] = 'application/xml; charset=utf-8'
  return response

차이점은 바로 pathname 필드값을 인코딩 후 저장한 바로 아래의 부분입니다.
result['pathname'] = urllib.parse.quote(result['pathname'])

이처럼 인코딩 후 네이버 서치 어드바이서에 다시 등록해보니 이번에는 에러 없이 정상 등록되었습니다. 예상된 결과이죠!

이처럼 Python앱에서 sitemap 문제가 나타난 경우 인코딩 문제일 수 있으니 위와 같은 방법으로 해결하시기 바랍니다.