티스토리 뷰

반응형
Notion에서 Tistory로 자동 업로드 #3 (notion html parsing)

개요


지난번에는 Tistory API 사용법과 notion에서 page export 하는 법까지 알아봤는데요,

이번에는 export한 HTML 파일에서 python코드(beatifulsoup)로 필요한 정보를 가져오는 법을 알아보겠습니다.

Python에서 Notion HTML Parsing하기


지난 1편에서와 같이 아래처럼 notion table property를 구성하셨다면, BeutifulSoup 모듈을 사용하여 다음과 같이 각각의 title, content, category, tag 값을 가져올 수 있습니다.

from bs4 import BeautifulSoup

# html 로드하기
with open('sample.html') as fp:
    soup = BeautifulSoup(fp, 'html.parser')

# 기존 head 태그(meta, title, style) 제거
soup.find('meta').extract()
soup.find('title').extract()
soup.find('style').extract()

# 본문 내용 가져오기
article = soup.find('article')

# class 명 추가(Notion_P라는 클래스를 추가하는 이유는 다음에 설명)
article['class'].append('Notion_P')

# 상태, 카테고리, 태그 가져오기
columns = article.find_all('tr')
for col in columns:
    col_name = col.find('th').text
    if col_name=='상태':
        status = col.find('td').text
    elif col_name=='카테고리':
        category = col.find('td').text
    elif col_name=='태그':
        tags = col.find('td')
        tags = tags.find_all('span')
        tags = [tag.text for tag in tags]

# tags는 배열 형태이므로 comma로 구분되는 문자열 값으로 변환
tags_str = ''
for tag in tags:
    tags_str += tag+', '
tags_str = tags_str[:-2]

# 테이블(notion property 표) 제거
for table in article.select('table'):
    table.extract()

# 제목 문자열 가져오고, 해당 태그는 제거
title = article.find('h1', class_='page-title')
title_text = title.text
title.extract()
  • 'sample.html' 경로에는 notion page를 export하여 다운로드 받은 html 파일 이름을 적어 줍니다.
  • title 변수가 게시할 글의 제목입니다.
  • 최종적으로 soup 변수가 Tistory API 에서 요청할 본문 내용(content)값이 됩니다.
  • status, category, tags가 각각 게시물의 발행 상태, 카테고리, 태그 값이 됩니다.
  • 각각의 값을 parsing했다면 이제 tistory API로 올리면 됩니다!

게시물 업로드하기


  • 다시 tistory api로 와서 위에서 가져온 각 변수들을 사용하여 게시물 업로드를 요청합니다.
  • category는 문자열 값이므로 숫자로 된 id값 찾아야 합니다.(게시물에 들어가보면 주소창에 나와있지만 추후에 API를 사용하여 찾을 예정)
import request

url = 'https://www.tistory.com/apis/post/write'
data = {
    'access_token': ACCESS_TOKEN,
    'blogName': BLOG_NAME,
    'output': 'lxml',
    'title': title,
    'content': soup,
    'viisibility': '0',
    'category': CATEGORY_ID,
    'tag':tags_str
}
# 업로드 요청
resp = requests.post(url, data=data)
# 게시글 업로드 요청 여부 확인
print(resp.status_code)

위 소스를 실행해보면 티스토리 블로그에 해당 게시물이 올라 간 것을 확인 할 수 있습니다.

다만 이렇게 하면 몇가지 문제가 있는데요, notion에서 제공하는 css가 적용되지 않습니다.

이를 해결하기 위해 2가지 방법이 있는데요,

  1. 매 게시물에 notion css를 html과 함께 업로드 하는 것입니다.
  1. Tistory 블로그 설정에서 전체 게시물에 적용되는 css를 수정 해주는 것입니다.

둘 중 어떤 방법을 해도 되지만 1번은 매 게시물에 css 를 추가 해줘야 하는 부담이 있기 때문에, 2번 방법으로 진행하겠습니다.

다음에는 CSS를 수정하는 법에 대해 알아보도록 하겠습니다.

💡
아래 블로그를 많이 참고하였습니다. https://boltlessengineer.tistory.com/46


본 게시물은 Notion에서 작성되어, 자동으로 업로드 되었습니다.

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday