【问题标题】:Javascript Jupyter Notebook How to get code cell content?Javascript Jupyter Notebook 如何获取代码单元格内容?
【发布时间】:2025-11-25 09:25:02
【问题描述】:

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

我想对代码进行分析。但是,如果我只是简单地检查 Jupyter Notebook 的 DOM,就会发现这是嵌套 divs 的真正 DOM 噩梦(可能有一半是多余的):

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

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

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

【问题讨论】:

    标签: javascript jquery dom jupyter-notebook jupyter


    【解决方案1】:

    查看 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 变量中以在 Python 单元格中执行 Javascript,并使用 IPython.notebook.kernel.execute 在 Javascript 中执行 Python - 这用于使用代码名称设置变量。请注意,您必须对引号等字符进行转义,以便我使用 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,但我真的需要将单元格的内容作为纯文本读取为我的 python 应用程序。有没有办法将此javascript对象转换为包含单元格文本的纯python字符串?这样做的任何方式都是可以接受的,否则即使是将此 javascript 变量中的文本保存到文本文件的方法也可以