Javascript Jupyter Notebook 如何获取代码单元格内容?

Javascript Jupyter Notebook How to get code cell content?

(有一个类似的问题,但它是关于使用python代码读取降价单元格。我想使用JavaScript(例如在Jupyter Notebook前面结束扩展)阅读代码单元格中的源代码。)

我想对代码进行分析。但是,如果我简单地检查 Jupyter Notebook 的 DOM,结果证明这是一个真正的 DOM 嵌套 div 的噩梦(可能有一半是多余的):

正如我们在这里看到的,源代码的每个字符都在其自己的元素中。自然地,我不太热衷于将所有这些东西从它的标签中拉出来并再次连接它只是为了获取代码单元的代码。有什么简单的方法可以获取单元格的源代码吗?

也许一些 Jupyter JS API 函数? (notebook 本身实际上是如何获取它发送给内核的代码的?应该已经有一些东西在做这项工作。)或者一些 jQuery 代码的一小段,它在获取所有内容方面非常聪明?

我能想到的一种替代方法是在内核在后端对其进行评估之前以某种方式拦截代码单元格的内容,但我也不知道该怎么做,它需要输出 HTML ,当它是 运行 时,它包含在代码单元的输出中具有立即执行函数的 JS。这也可能变得复杂,如果我想要实际代码的输出 代码单元输出中代码分析的输出。也许它没有我想象的那么复杂,但到目前为止,如果有一些简单的方法来获取它,那么在 JS 端获取代码似乎更好...

看看 Juypter cell.js 文件 here - 它列出了 Jupyter 本身用来与细胞交互的函数。特别是,函数 get_text() 将 return 单元格的内容。 (这适用于所有类型的单元格 - 请查看 codecell.js 文件以了解特定于代码单元格的功能)

在浏览器中进行测试的快速方法 - 访问全局 Jupyter 对象的 notebook 实例以获取笔记本的第一个单元格:

var cell = Jupyter.notebook.get_cell(0);

现在我们有了单元格 - 我们可以阅读其中的代码了!使用:

var code = cell.get_text();

编辑:您可以使用 Javascript 函数在 Python 单元格中执行 Javascript 并将 IPython.notebook.kernel.execute 保存到 Python 变量在 Javascript 中执行 Python - 这用于设置代码名称的变量。请注意,您必须转义引号等字符才能使用 encodeURI 执行 URI encoding/decoding.

from IPython.display import Javascript
import urllib.parse

Javascript("const code = Jupyter.notebook.get_cell(0).get_text(); IPython.notebook.kernel.execute(`myvar = '${encodeURI(code)}'`);")
urllib.parse.unquote(myvar)