(有一个类似的问题 here ,但它是关于使用 python 代码读取 Markdown 单元格。我想使用 JavaScript(例如在 Jupyter Notebook 前端扩展中)读取代码单元格中的源代码。 )
我想对代码进行分析。但是,如果我只是检查 Jupyter Notebook 的 DOM,结果证明它是嵌套 div
的真正 DOM 噩梦(可能有一半是多余的):
正如我们在这里看到的,源代码的每个字符都在其自己的元素中。自然地,我不太热衷于将所有这些东西从它的标签中拉出来并再次连接它只是为了获取代码单元的代码。有什么简单的方法可以获取单元格的源代码吗?
也许是一些 Jupyter JS API 函数? (notebook 本身实际上如何获取它发送给内核的代码?应该已经有一些东西在做这项工作。)或者一些 jQuery 代码片段,它在获取所有内容方面非常聪明?
我能想到的一种替代方法是在内核在后端对其进行评估之前以某种方式拦截代码单元格的内容,但我也不知道该怎么做,它需要输出 HTML,其中包含带有 JS 的运行时立即在代码单元的输出中执行函数。这也可能变得复杂,如果我想要实际代码的输出和代码单元输出中的代码分析的输出。也许它没有我想象的那么复杂,但到目前为止,如果有一些简单的方法来获取它,那么在 JS 端获取代码似乎更好......
最佳答案
看看 Juypter cell.js
文件 here - 它列出了 Jupyter 本身用来与细胞交互的功能。特别是,函数 get_text()
将返回单元格的内容。 (这适用于所有类型的单元格 - 请查看 codecell.js
文件以了解特定于代码单元格的功能)
在浏览器中进行测试的一种快速方法 - 访问全局 Jupyter
对象的 notebook
实例以获取笔记本的第一个单元格:
var cell = Jupyter.notebook.get_cell(0);
现在我们有了单元格 - 我们可以读取其中的代码了!使用:
var code = cell.get_text();
编辑:您可以使用 Javascript
函数在 Python 单元格中执行 Javascript 并使用 IPython.notebook.kernel.execute
执行 Python 将此结果保存到 Python 变量在 Javascript 中 - 这用于设置代码名称的变量。请注意,您必须转义引号等字符才能使用 encodeURI 执行 URI 编码/解码。
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)
关于Javascript Jupyter Notebook 如何获取代码单元格内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42773092/