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?

Kaggle/Jupyter Notebook の実行結果(アウトプット)だけを一括コピーする方法

Posted at

💻 Kaggle/Jupyter Notebook の実行結果(アウトプット)だけを一括コピーする方法

❌ 失敗する理由:なぜ普通のコピペではダメなのか?

  • HTML構造の問題: ノートブックのコード入力部分実行結果部分は、HTML上で別の要素として存在しています。Ctrl+A(全選択)をしても、両方が混ざってコピーされてしまいます。
  • Iframe(アイフレーム)の壁: KaggleやGoogle Colabなどの環境では、ノートブックのコンテンツがページの「小窓(iframe)」の中に埋め込まれていることが多く、ブラウザのコンソールから直接データにアクセスできない場合があります。

✅ 解決策1:JavaScript(ブラウザのコンソールを使う裏技)

これが最も手軽に、ローカル環境を汚さずに実行できる方法です。

📌 ステップ 1: デベロッパーツールを開く

  • Kaggleのノートブックを開いた状態で、右クリック → **「検証(Inspect)」**を選択し、「Console」タブを開きます。

📌 ステップ 2: 貼り付けロックを解除する(初回のみ)

ブラウザのセキュリティ警告が出た場合、コンソールに以下の文字を手入力してEnterを押します。

allow pasting

📌 ステップ 3: コンソールの視点(コンテキスト)を切り替える(重要!)

ノートブックの中身にアクセスできるよう、コンソールの視点を切り替えます。

  1. Consoleタブの上部にある、現在のコンテキスト(通常は top と表示されている)のドロップダウンをクリックします。
  2. リストの中から、ノートブック本体を示す項目(例:notebook-editor-cells (...)iframe を含む項目)を選択します。

📌 ステップ 4: コピー用JavaScriptを実行する

コンテキストを切り替えた状態で、以下のコードを貼り付けてEnterを押します。

// ノートブックの出力エリアになり得る複数のHTMLクラスを指定して要素を取得
var candidates = document.querySelectorAll(
    '[data-testid="kernel-cell-output"], .jp-OutputArea-output, .output_subarea'
);

// 取得した要素のinnerTextを結合し、区切り文字を挿入
var resultText = Array.from(candidates)
                 .map(el => el.innerText)
                 .join('\n--------------------\n');

// クリップボードにコピー
if (resultText.trim().length > 0) { 
    copy(resultText); 
    alert("コピー成功!メモ帳などに貼り付けて確認してください。"); 
} else { 
    alert("出力テキストが見つかりませんでした。"); 
}

💾 解決策2:Pythonスクリプトでファイルを解析する(最も確実な方法)

ブラウザのUIに依存せず、常に確実に出力結果だけを抽出したい場合は、ノートブックの元ファイル(.ipynb)を解析するのが一番確実です。

📌 ステップ 1: ノートブックをダウンロード

  • Kaggleのメニューで FileDownload Notebook を選択し、.ipynb ファイルをダウンロードします。

📌 ステップ 2: Pythonスクリプトを実行

ダウンロードしたファイルと同じ場所に、以下のPythonコードを保存し実行します。

import json

filename = "ダウンロードしたファイル名.ipynb" 

with open(filename, 'r', encoding='utf-8') as f:
    nb = json.load(f)

output_text = []
for cell in nb['cells']:
    if 'outputs' in cell:
        for output in cell['outputs']:
            # 'text'または'text/plain'に含まれるデータを抽出
            lines = []
            if 'text' in output:
                lines = output['text']
            elif 'data' in output and 'text/plain' in output['data']:
                lines = output['data']['text/plain']
            
            if lines:
                output_text.append("".join(lines))
                output_text.append("-" * 20) # 区切り線

# 結果をコンソールに出力
print("\n".join(output_text))

以上

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?