2026.06.28(日) / 14:48
自分のブログ記事の一覧を取得して、NoteBookLMにソースとして読み込ませたい ①
- ID
- 38010
- Published
- 2026-06-28 14:48
- Modified
- 2026-06-30 11:40
- Author
- khiro
- Categories
- デフォルト
- Tags
- NotebookLM × 自分のブログ
この記事は、個人のブログ資産をAIツールであるNotebookLMへ統合し、独自の知識ベースを構築する試みを解説しています。筆者はWordPress REST APIを活用し、蓄積された約1,500件の記事データを効率的に抽出する仕組みを構築しました。作業工程では、データベースから情報を取得してマークダウン形式へ変換する専用スクリプトを作成し、発生したシステムエラーを逐次解消していく過程が記されています。また、AIが読み込みやすいようにHTMLタグを除去するデータ整形の重要性についても触れられています。最終的には、特定の技術記事だけでなく全投稿データを同期させることで、自身の思考ログを包括的にデジタル管理することを目指しています。
ChatGPTに相談
チャッピーに「自分のブログ記事の一覧を取得して、NoteBookLMにソースとして読み込ませたい」と相談した

「できます」とのこと
方法③ 自分のMy Portfolio経由を選択
方法を3つ提案されて、自分のMy Portfolio経由を選択した
WordPress上の約1,500記事をREST API経由で取得して、自動同期する仕組みが備わっているため、記事タイトルと本文形式のマークダウンを作成できる

NotebookLMに投入するまでの流れと投入後にできること
WordPressのREST API経由で全記事取得 → マークダウン作成 → NotebookLMに投入

My PortfolioのDBを確認する
進めていく

記事を保存しているテーブル構造(モデル)の確認
My Portfolioで記事を保存しているテーブル構造を確認する
models.pyのBlogモデル
https://github.com/ki-hi-ro/my-portfolio/blob/main/app/models.py

必要なカラムは揃っているので、Markdown生成スクリプトを作成する
必要なカラムは揃っている

export_notebooklm.pyを作って、Markdown生成スクリプトを作成する
from database import SessionLocal
from models import Blog
def export_blogs_to_markdown():
db = SessionLocal()
blogs = db.query(Blog).order_by(Blog.published_at.desc()).all()
with open("notebooklm_blog_source.md", "w", encoding="utf-8") as f:
f.write("# ki-hi-ro.com ブログ記事一覧\n\n")
for blog in blogs:
f.write(f"# {blog.title}\n\n")
f.write(f"URL: {blog.url}\n\n")
f.write(f"公開日: {blog.published_at}\n\n")
f.write(f"タグ: {blog.tags}\n\n")
if blog.summary:
f.write("## 要約\n\n")
f.write(f"{blog.summary}\n\n")
f.write("## 本文\n\n")
f.write(f"{blog.content}\n\n")
f.write("---\n\n")
db.close()
if __name__ == "__main__":
export_blogs_to_markdown()
print("NotebookLM用Markdownを書き出しました。")
どこに配置するか?

appの下階層に配置しよう

スクリプトファイルの作成完了

実行

(venv) hiroki@shibatahiroshitakanoiMac app % python export_notebooklm.py
エラー発生(appというモジュールが見つからない)
Traceback (most recent call last):
File "/Users/hiroki/programing_output/my-portfolio/app/export_notebooklm.py", line 2, in <module>
from models import Blog
File "/Users/hiroki/programing_output/my-portfolio/app/models.py", line 4, in <module>
from app.database import Base
ModuleNotFoundError: No module named 'app'
appというモジュールが見つからないというエラー
エラーの原因
Pythonから見ると、appの中にいるため、app.databaseが見つからない

解決
appまで降りてしまっていたが、上の階層に戻ろう
(venv) hiroki@shibatahiroshitakanoiMac app % cd ..
(venv) hiroki@shibatahiroshitakanoiMac my-portfolio %

次のエラー
(venv) hiroki@shibatahiroshitakanoiMac my-portfolio % python -m app.export_notebooklm
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/Users/hiroki/programing_output/my-portfolio/app/export_notebooklm.py", line 1, in <module>
from database import SessionLocal
ModuleNotFoundError: No module named 'database'
原因
「databaseというモジュールが存在しないので、インストールしよう」と思ったが、
-mをつけてpythonを実行する場合は、appパッケージ配下として扱われるのが原因のようだ
from databaseをfrom app.databaseに修正する必要があった

解決
from app.database import SessionLocal
from app.models import Blog
app.を追加して、実行する
成功
(venv) hiroki@shibatahiroshitakanoiMac my-portfolio % python -m app.export_notebooklm
NotebookLM用Markdownを書き出しました。
8万行以上のブログ記事情報をマークダウンファイルに書き出すことができた

Notebook LMに読み込ませるために、データを整形する
BeautifukSoupで、本文からHTMLタグを除去する

本文からHTMLタグを除去する
以下の赤字部分を修正した
from app.database import SessionLocal
from app.models import Blog
from bs4 import BeautifulSoup
def export_blogs_to_markdown():
db = SessionLocal()
blogs = db.query(Blog).order_by(Blog.published_at.desc()).all()
with open("notebooklm_blog_source.md", "w", encoding="utf-8") as f:
f.write("# ki-hi-ro.com ブログ記事一覧\n\n")
for blog in blogs:
f.write(f"# {blog.title}\n\n")
f.write(f"URL: {blog.url}\n\n")
f.write(f"公開日: {blog.published_at}\n\n")
f.write(f"タグ: {blog.tags}\n\n")
if blog.summary:
f.write("## 要約\n\n")
f.write(f"{blog.summary}\n\n")
content = blog.content or ""
plain_text = BeautifulSoup(content, "html.parser").get_text("\n")
f.write("## 本文\n\n")
f.write(f"{plain_text}\n\n")
f.write("---\n\n")
db.close()
if __name__ == "__main__":
export_blogs_to_markdown()
print("NotebookLM用Markdownを書き出しました。")
完了
タイトルと本文のみがマークダウンファイルに書き出された

次回 : 技術ブログのみではなく、全記事を取得したい
ただし、今回取得したのは、以下の記事、
で抽出した「Googleスプレッドシートで設定した技術ブログ」の389記事なので、

全記事に変更したい