🗄️ 데이터센터
home
주식거래 데이터
home

노션 블럭 검색 원리

노션 페이지블록리스트로 가져오는 작업부터 시작했습니다. 이제 이 함수를 사용해 가져온 블록들 중에서 원하는 조건의 블록을 찾아보겠습니다. 노션에서는 블록 추가 시 사용자가 직접 ID를 지정할 수 없으므로, 리스트딕셔너리를 활용하는 방법을 알아야 합니다. 이 방법을 통해 자동화 시나리오에 맞춰 원하는 블록을 검색하고, 블록 ID를 얻어 삭제나 업데이트를 하거나, 필요한 경우 새로운 블록을 추가하는 로직을 구현할 수 있습니다.
대부분의 APIJSON(딕셔너리) 형태로 자료구조를 요청하고 응답받는 방식을 사용합니다. 이번 페이지에서 JSON 구조의 검색방법을 익히면 노션뿐만 아니라 다양한 API를 자유롭게 활용할 수 있게 될 것입니다.

테스트 페이지에 블럭 작성

테스트 페이지를 하나 생성하고 API를 연결하세요. 그 다음 원하는 블록을 작성합니다. 저는 '노션블럭자동 추가' 페이지에서 최근 만들었던 텍스트 블록 추가 함수들을 활용하여 블록을 추가하도록 하겠습니다.

블럭확인

전체 블럭 요청

블록 확인 함수를 사용하여 페이지 내의 블록 목록을 불러오겠습니다.
import requests # requests페이지참고 notionApiKey = notionApiKey # 사용자의 API키입력 # 함수 페이지 참고 # 함수요약 페이지 참고 def getBlock(notionPageId): url = f"https://api.notion.com/v1/blocks/{notionPageId}/children" headers = { "Authorization": f"Bearer {notionApiKey}", "Content-Type": "application/json", "Notion-Version": "2022-06-28" } response = requests.get(url, headers=headers) if response.status_code != 200: print(f"[오류] 노션 블럭 조회 실패: {response.status_code}, {response.text}") return [] blocks = response.json().get("results", []) return blocks notionPageId = '1658844c10b7807b8391d5a11e7a4dff' # 연동할 페이지 ID입력 getBlock(notionPageId)
Python
복사

1개 블럭 구조

아래는 블럭 하나의 정보를 가지고 있는 딕셔너리 입니다. id는 유니크한 ID이고 그외 다양한 데이터를 가지고 있습니다.
{'object': 'block', 'id': '1768844c-10b7-8119-8b18-d7cd37442ab7', 'parent': {'type': 'page_id', 'page_id': '1658844c-10b7-807b-8391-d5a11e7a4dff'}, 'created_time': '2025-01-09T07:37:00.000Z', 'last_edited_time': '2025-01-09T07:37:00.000Z', 'created_by': {'object': 'user', 'id': 'd10f8b32-31bb-4246-9925-de881ca0d458'}, 'last_edited_by': {'object': 'user', 'id': 'd10f8b32-31bb-4246-9925-de881ca0d458'}, 'has_children': False, 'archived': False, 'in_trash': False, 'type': 'paragraph', 'paragraph': {'rich_text': [{'type': 'text', 'text': {'content': '기본 텍스트 블록입니다.', 'link': None}, 'annotations': {'bold': False, 'italic': False, 'strikethrough': False, 'underline': False, 'code': False, 'color': 'default'}, 'plain_text': '기본 텍스트 블록입니다.', 'href': None}], 'color': 'default'}},
Plain Text
복사

순서로 블럭 ID 얻기

블럭들의 데이터는 리스트로 가지고 옵니다. 그럼 블럭의 순서를 정확하게 알고 있다면 그 순서로 블럭의 키를 받아올수있겠죠?

첫번째 계층의 활용

1) 첫번째 계층의 키값

첫 번째 계층의 키만 출력해보면 아래와 같은 결과를 얻을 수 있습니다. ID를 알 수 없을 때는 type 키를 활용할 수 있습니다.

2) 블럭타입으로 id얻기

정확한 일치("==") 조건으로 조회하지 않는 이유는 찾고자 하는 타입명을 정확히 모를 때도 검색이 가능하도록 하기 위함입니다.
blockType = 'heading' # 찾을 블럭 타입 result = [items['id'] for items in data if blockType in items.get('type', '')] ''' for문버전 result = [] for num,items in enumerate(data): if blockType in items.get('type'): result.append(items['id']) ''' result
Python
복사

블럭타입과 키워드로 찾기

items.get('type')은 블럭 타입을 알려줍니다. 이를 통해 블럭타입명을 얻을 수 있고, 이 타입명을 키로 하는 딕셔너리 계층을 활용할 수 있습니다. rich_text 계층은 리스트 구조로 구성되어 있으며 plain_text 키를 포함합니다. 이 텍스트 값과 keyword를 비교하여 원하는 블록을 찾을 수 있습니다.
blockType = 'paragraph' keyword = '블록입니다.' result = [] for num,items in enumerate(data): if blockType in items.get('type'): plain_text = items[items.get('type')]['rich_text'][0]['plain_text'] if keyword in plain_text: print(plain_text) result.append(items['id']) result
Python
복사

키워드만 검사하기

블록 타입명을 모르는 경우가 있을 수 있습니다. 키워드만으로 검색을 해보겠습니다.
keyword = '굵고' result = [] for num,items in enumerate(data): plain_text = items[items.get('type')]['rich_text'][0]['plain_text'] if keyword in plain_text: print(plain_text) result.append(items['id']) result
Python
복사

활용방안

블록을 검사하는 방법을 알아보았습니다. 데이터 구조를 이해하고 접근하는 방법을 알아야 조건을 통해 원하는 블록을 찾을 수 있습니다. 제가 함수를 만들어 배포하거나 챗지피티에게 요청해서 함수를 만들더라도 모든 시나리오에 완벽하게 적용할 수는 없습니다. 따라서 개인이 원하는 조건에 맞게 데이터 구조를 파악하고 검색하는 방법을 알아야 합니다. 본인의 시나리오에 해당하는 함수를 직접 만들어보세요! 나중에는 다양한 조건에 대응할 수 있는 검색 클래스를 만들어 보는 것도 좋은 방법입니다.