본문 바로가기
컴퓨터 인터넷 모바일 it/블로그 애드센스 등

티스토리 블로그 워드프레스 이전 파이썬 스크립트

by 하누혀누IT 2025. 5. 29.
반응형

티스토리 블로그 워드프레스 이전용 파이썬 스크립트

티스토리 블로그를 워드프레스로 옮길 때 가장 손이 많이 가는 부분이 바로 XML 포맷으로의 변환 작업입니다. 특히 글이 수백~수천 개가 넘어가면 워드프레스가 한 번에 임포트하지 못하고 멈춰 버리기 일쑤인데요, 이를 해결하기 위해 직접 만든 tistory_to_wp.py 스크립트의 개발 과정과 사용법, 그리고 한계점을 정리해 보았습니다.

티스토리 블로그 워드프레스 이전하는 방법


개발 배경

  • 워크플로우 문제
    1. 티스토리의 Sitemap을 통해 전체 포스트 URL을 가져오고
      • 티스토리 블로그 사이트맵 페이지를 여세요. http://당신블로그주소.tistory.com/sitemap.xml
      • sitemap.xml 화면에서 마우스 오른쪽 버튼을 눌러서 파일로 저장합니다.
    2. 각 URL에서 HTML을 크롤링한 뒤
    3. 워드프레스가 읽을 수 있는 WXR(XML) 포맷으로 변환이 과정을 수작업 또는 GUI 도구로 반복하기에는 글이 많을 때 너무 번거로웠습니다.
  • 분할 임포트 필요
    워드프레스에서는 대용량 WXR 파일을 한 번에 임포트하면 메모리 부족이나 타임아웃이 발생합니다. 그래서 100개 단위로 XML을 분할 저장하는 로직을 넣기로 했습니다.

tistory_to_wp.py
0.01MB


개발 과정

  1. Sitemap 파싱sitemap.xml에서 /entry/가 포함된 포스트 URL만 뽑아냅니다.
def parse_sitemap(path):
    tree = ET.parse(path)
    root = tree.getroot()
    ns = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
    return [el.text for el in root.findall('.//ns:loc', ns) if '/entry/' in el.text]
  1. 본문 크롤링 & 정제– 광고 스크립트, <iframe>, <button> 등을 제거해 최소한의 HTML로 정제합니다.
resp = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, 'html.parser')
content_html = soup.find('div', class_='contents_style').decode_contents()
cleaned = clean_entry_content(content_html)
  1. WXR 문서 생성<title>·<dc:creator>·<guid>·<wp:…> 태그들을 CDATA로 감싸고, 날짜는 YYYY-MM-DD HH:MM:SS 형식으로 맞췄습니다.
ce = etree.SubElement(item, '{http://purl.org/rss/1.0/modules/content/}encoded')
ce.text = etree.CDATA(minified_html)
add(item, '{http://wordpress.org/export/1.2/}post_date', '2024-02-12 21:53:06')
  1. 100개 단위 분할 저장– 포스트 리스트를 100개씩 잘라서 wordpress_export_final-001.xml, -002.xml… 처럼 저장합니다.
prefix, ext = args.output.rsplit('.', 1)
for i in range(0, len(posts), 100):
    chunk = posts[i:i+100]
    out_file = f"{prefix}-{i//100+1:03d}.{ext}"
    build_wxr(chunk, out_file, base_url, start_id=i)

사용법

  1. 필요한 라이브러리 설치
pip install requests beautifulsoup4 lxml

2 스크립트 실행
- --sitemap: 티스토리 사이트맵 파일 경로
- --output: 생성할 WXR 파일의 접두사 및 확장자 지정

python tistory_to_wp.py \
  --sitemap sitemap.xml \
  --output wordpress_export_final.xml

  1. 생성된 파일
wordpress_export_final-001.xml  
wordpress_export_final-002.xml  
…
  1. 워드프레스 임포트
    • 관리자 → 도구 → 가져오기 → WordPress
    • 생성된 WXR 파일을 순서대로 업로드

한계점 및 주의사항

  • 이미지·미디어는 별도 백업
    • 본 스크립트는 본문 HTML만 변환하며, 첨부된 이미지나 미디어 파일 다운로드 기능은 없습니다.
    • 대신 티스토리 블로그를 그대로 유지한 채 이용하면 이미지는 티스토리 블로그에 첨부된 이미지를 바라봅니다.
      • 다만 이 경우, 워드프레스에서 No Image로 보이지만, 편집에서 블록으로 전환해주고 저장하거나 처음부터 구텐베르크 편집기를 쓰지 않는다면 이미지가 오비니다.
  • 페이지 구조 변화에 취약
    • 티스토리 스킨 변경 시 CSS 클래스가 달라지면 크롤러가 본문을 못 찾을 수 있습니다.
    • 따라서 이 플러그인이 기준으로 삼고 있는 BookClub 스킨으로 변경 후 작업하십시오.
    • CCL 설정은 끈 상태로 sitemap.xml을 생성하십시오.
  • 댓글·사용자 메타 제외
    • 댓글, 태그, 카테고리 매핑 로직은 최소화했습니다. 필요한 경우 추가 개발이 필요합니다.
  • 인코딩 문제
    • Windows cp949 콘솔에서는 유니코드 이모지(🛠️ 등) 출력이 깨질 수 있으니, 로그 문구를 단순 텍스트로 조정하세요.
  • 네트워크·타임아웃
    • 대량 크롤링 중 요청 실패가 발생할 수 있습니다. --timeout 값을 조절하거나, 재시도 로직을 추가하면 안정성이 올라갑니다.

이제 이 스크립트 한 번으로 수백~수천 개의 티스토리 글을 100개 단위로 나눠 워드프레스에 안정적으로 임포트할 수 있습니다. 필요에 따라 분할 크기(100)나 메타데이터 처리 방식을 커스터마이즈해 보세요!

반응형

댓글