💻 Kaggle/Jupyter Notebook の実行結果(アウトプット)だけを一括コピーする方法
❌ 失敗する理由:なぜ普通のコピペではダメなのか?
- HTML構造の問題: ノートブックのコード入力部分と実行結果部分は、HTML上で別の要素として存在しています。Ctrl+A(全選択)をしても、両方が混ざってコピーされてしまいます。
- Iframe(アイフレーム)の壁: KaggleやGoogle Colabなどの環境では、ノートブックのコンテンツがページの「小窓(iframe)」の中に埋め込まれていることが多く、ブラウザのコンソールから直接データにアクセスできない場合があります。
✅ 解決策1:JavaScript(ブラウザのコンソールを使う裏技)
これが最も手軽に、ローカル環境を汚さずに実行できる方法です。
📌 ステップ 1: デベロッパーツールを開く
- Kaggleのノートブックを開いた状態で、右クリック → **「検証(Inspect)」**を選択し、「Console」タブを開きます。
📌 ステップ 2: 貼り付けロックを解除する(初回のみ)
ブラウザのセキュリティ警告が出た場合、コンソールに以下の文字を手入力してEnterを押します。
allow pasting
📌 ステップ 3: コンソールの視点(コンテキスト)を切り替える(重要!)
ノートブックの中身にアクセスできるよう、コンソールの視点を切り替えます。
- Consoleタブの上部にある、現在のコンテキスト(通常は
topと表示されている)のドロップダウンをクリックします。 - リストの中から、ノートブック本体を示す項目(例:
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のメニューで
File→Download 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))
以上