얼마 전 올린 포스팅은 Python 앱에서 sitemap을 생성하여 검색엔진의 사이트맵에 등록하는 것이었습니다.
관련 링크 >
https://webisfree.com/2020-08-17/python에서-xml-사이트맵-페이지-만들기
그런데 구글 웹마스터와 달리 네이버 서치 어드바이서의 경우 sitemap 등록시 에러가 발생했습니다. 에러 문구는 특정 라인에서 에러가 발생된다는 점입니다.
! Jinja2를 사용한 방법
(업데이트) Jinja2의 필터를 사용한 방법으로 sitemap 등록 에러를 수정한 방법입니다. python 코드의 수정 없이 jinja2 템플릿 수정만으로 네이버 서치 어드바이서에 정상 등록되었습니다. jinja2 코드는 아래와 같습니다.
python에서 해당 템플릿 파일에 myArticles로 리스트를 전달합니다. 이때 jinja2 템플릿에서는 주소를 출력할 때 아래와 같이 urlencode 필터를 사용합니다.
이렇게 적용 후 네이버 검색엔진의 사이트 어드바이서에 등록합니다. 이 전과 달리 정상 동작하였습니다.
참고로 구글 search console, naver의 search advisor 모두 문제가 없었다면 위와 같은 인코딩이 따로 필요하지 않을 수 있습니다. 테스트 사이트맵의 경우 url에 특수문자가 포함되어 있었으며 이런 부분이 문제가 되었습니다.
! 네이버 서치 어드바이서 sitemap 에러 해결하기
원인은 여러가지 있겠지만 이미 다른 검색엔진에서 잘 동작하는 sitemap이였고 특정 라인에서만 문제가 있어 확인해보니 주소쪽에 문제가 있었습니다. 결국 원인은 검색엔진에서 sitemap url 파싱 차이라고 판단했습니다.
원인 해결을 위해서는 url을 한 번 더 인코딩(encode)이 필요하다고 생각했고 python에서 주소 인코딩 방법 중 아래의 내장 함수를 사용하기로 결정했습니다.
urllib.parse.quote(문자열)
주소를 저장한 필드의 값을 가져와 인코딩 후 다시 저장하여 해결하려고 했습니다. 아래는 작성된 코드의 일부입니다.
차이점은 바로 pathname 필드값을 인코딩 후 저장한 바로 아래의 부분입니다.
이처럼 인코딩 후 네이버 서치 어드바이서에 다시 등록해보니 이번에는 에러 없이 정상 등록되었습니다. 예상된 결과이죠!
이처럼 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>
<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
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 문제가 나타난 경우 인코딩 문제일 수 있으니 위와 같은 방법으로 해결하시기 바랍니다.
Author ByEnSSo