0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita記事のURLを指定してリンク先記事と一緒にMarkDownテキストにしてくれるPythonコード

Posted at

概要

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

今回のコードでできること

リンク付きQiita記事のURLを指定すると
image.png

リンク先も一緒にマークダウンとして出力する
下の画像は指定したURLの記事のマークダウン部分
image.png
下の画像は指定したURLの記事のリンク先のマークダウン部分
image.png

動機

  • 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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?