概要
Qiitaの記事には、複数の参考文献リンクを持つ記事があり、すべてに目を通さなければ完全に記事を理解できないものもある。
それらのリンク先も含めてテキスト化し生成AIに与えて質問することで効率よく理解を深めたい。
そのためにQiita記事を指定すると、その記事とその記事が持つリンク先の記事をまとめてマークダウンにするPythonコードを作った。
Qiita記事のマークダウン化
Qiita記事はURLの最後に.mdをつけることでマークダウン形式を取得できる。
これにはマークダウン整形できる他にも、余計な広告URLを取り除けるといった利点もある。
下のURLならQiitaの記事に飛ぶ
https://qiita.com/kanata564/items/8e284613452f1a78e02e
.mdを付けた下のURLなら記事のマークダウン形式が取れる
https://qiita.com/kanata564/items/8e284613452f1a78e02e.md
今回のコードでできること
リンク先も一緒にマークダウンとして出力する
下の画像は指定したURLの記事のマークダウン部分

下の画像は指定したURLの記事のリンク先のマークダウン部分

動機
- Qiita記事のリンク先も含めてテキストにしたい
- 生成AIに与えて、自分の知りたい情報であるかを質問して確認したい
- たくさんのリンクを持つまとめ記事を効率よく確認したい
使い方
- "qiita_md_collector.py"ファイルを作成してエディタでソースコードを張り付ける
- "qiita_md_collector.py"をクリックして、指示に従ってQiita記事のURLを指定する
- "output.md"にテキスト化した結果が入っているので、生成AIへの質問等で活用する
ソースコード(Pythonファイル)
import requests
import re
# =========================
# 定数定義
# =========================
# Qiita記事URLの正規表現パターン(例:https://qiita.com/user/items/abcd1234)
qiita_url_pattern = r'https://qiita\.com/[a-zA-Z0-9_-]+/items/[a-zA-Z0-9]+'
# 拡張子付きURL(.png, .jpg, .pdfなど)を除外するための正規表現
ext_pattern = r'\.[a-zA-Z0-9]{2,5}(\.[a-zA-Z0-9]{2,5})?$'
# =========================
# 関数定義
# =========================
def get_md_text(qiita_url):
"""
指定したQiita記事のMarkdown(.md)形式テキストを取得する関数
- Qiita記事の通常URLを.md形式に変換してGETリクエストを送る
- 成功時:Markdownテキストを返す
- 失敗時:例外を発生させる
"""
# URL末尾が.mdで終わっていなければ.mdを追加
if not qiita_url.endswith('.md'):
if qiita_url.endswith('/'):
qiita_url = qiita_url[:-1] # 末尾のスラッシュを削除
qiita_url += '.md'
# Qiitaにリクエスト送信
res = requests.get(qiita_url)
res.raise_for_status() # ステータスコードが200以外なら例外発生
return res.text
def extract_qiita_urls(md_text):
"""
Markdownテキスト中からQiita記事URLをすべて抽出する関数
- Qiita記事URLを正規表現で抽出
- 画像などの拡張子付きURLを除外
- 重複URLを削除してリストで返す
"""
# Qiita記事URLをすべて抽出
all_urls = re.findall(qiita_url_pattern, md_text)
# 拡張子付きURLを除外(例:https://qiita.com/.../items/...png)
filtered_urls = [
url for url in all_urls
if not re.search(ext_pattern, url.lower())
]
# 重複削除して返す
return list(set(filtered_urls))
def qiita_md_and_urls(qiita_url, md_filename='output.md'):
"""
指定したQiita記事と、その記事内でリンクされている他のQiita記事をすべてMarkdownとして保存する関数。
手順:
1. 入力されたQiita記事URLからMarkdownを取得
2. そのMarkdown内のQiitaリンクを抽出
3. 最初の記事Markdownをファイルに書き込み
4. 連続してリンク先Qiita記事のMarkdownも追記
"""
# 1️⃣ 最初の記事をMarkdown形式で取得
main_md = get_md_text(qiita_url)
# 2️⃣ Qiita記事URLを抽出
qiita_urls = extract_qiita_urls(main_md)
# 3️⃣ 最初の記事をoutput.mdに書き込み
with open(md_filename, 'w', encoding='utf-8') as f:
f.write(f'# {qiita_url}\n\n') # 見出しとしてURLを記載
f.write(main_md)
f.write('\n\n')
print(f"✅ 最初のMarkdownを保存しました: {md_filename}")
# 4️⃣ 抽出した各Qiita記事URLを順次取得して追記
for url in qiita_urls:
try:
md_text = get_md_text(url)
with open(md_filename, 'a', encoding='utf-8') as f:
f.write(f'# {url}\n\n')
f.write(md_text)
f.write('\n\n')
print(f"📄 {url} のMarkdownを追加しました")
except Exception as e:
print(f"⚠️ {url} の取得に失敗しました: {e}")
print("🎉 すべてのQiita記事をoutput.mdに保存しました。")
# 取得した全URLをリストで返す
return [qiita_url] + qiita_urls
# =========================
# メイン処理(スクリプトとして実行されたときのみ動作)
# =========================
if __name__ == "__main__":
qiita_url = input("Qiita記事のURLを入力してください: ")
# 入力されたURLがQiita記事URL形式かチェック
if not re.fullmatch(qiita_url_pattern, qiita_url):
print("❌ Qiita記事URLの形式ではありません。正しいURLを入力してください。")
else:
qiita_md_and_urls(qiita_url)
