206

是否可以将呈现的 HTML 输出嵌入到 IPython 输出中?

一种方法是使用

from IPython.core.display import HTML
HTML('<a href="http://example.com">link</a>')

或(IPython 多行单元格别名)

%%html
<a href="http://example.com">link</a>

它返回一个格式化的链接,但是

  1. 此链接不会从控制台打开带有网页本身的浏览器。不过,IPython 笔记本支持诚实渲染。
  2. 我不知道如何HTML()在列表或pandas打印表中呈现对象。您可以这样做df.to_html(),但无需在单元格内创建链接。
  3. 此输出在 PyCharm Python 控制台中不是交互式的(因为它不是 QT)。

如何克服这些缺点并使 IPython 输出更具交互性?

4

6 回答 6

316

这似乎对我有用:

from IPython.core.display import display, HTML
display(HTML('<h1>Hello, world!</h1>'))

诀窍是将它也包装在“显示”中。

资料来源: http: //python.6.x6.nabble.com/Printing-HTML-within-IPython-Notebook-IPython-specific-prettyprint-tp5016624p5016631.html

于 2016-03-03T00:31:26.050 回答
51

前段时间 Jupyter Notebooks 开始从 HTML 内容中剥离 JavaScript [ #3118 ]。这里有两个解决方案:

提供本地 HTML

如果你现在想在你的页面上嵌入一个带有 JavaScript 的 HTML 页面,最简单的方法是将你的 HTML 文件保存到你的 notebook 的目录中,然后按如下方式加载 HTML:

from IPython.display import IFrame

IFrame(src='./nice.html', width=700, height=600)

提供远程 HTML

如果您更喜欢托管解决方案,您可以将 HTML 页面上传到 S3 中的 Amazon Web Services“存储桶”,更改该存储桶上的设置以使存储桶托管静态网站,然后在笔记本中使用 iframe 组件:

from IPython.display import IFrame

IFrame(src='https://s3.amazonaws.com/duhaime/blog/visualizations/isolation-forests.html', width=700, height=600)

这将在 iframe 中呈现您的 HTML 内容和 JavaScript,就像您可以在任何其他网页上一样:

<iframe src='https://s3.amazonaws.com/duhaime/blog/visualizations/isolation-forests.html', width=700, height=600></iframe>

于 2018-09-14T19:28:45.423 回答
21

相关:在构造类时,def _repr_html_(self): ...可用于创建其实例的自定义 HTML 表示:

class Foo:
    def _repr_html_(self):
        return "Hello <b>World</b>!"

o = Foo()
o

将呈现为:

你好世界

有关更多信息,请参阅IPython 的文档

一个高级示例:

from html import escape # Python 3 only :-)

class Todo:
    def __init__(self):
        self.items = []

    def add(self, text, completed):
        self.items.append({'text': text, 'completed': completed})

    def _repr_html_(self):
        return "<ol>{}</ol>".format("".join("<li>{} {}</li>".format(
            "☑" if item['completed'] else "☐",
            escape(item['text'])
        ) for item in self.items))

my_todo = Todo()
my_todo.add("Buy milk", False)
my_todo.add("Do homework", False)
my_todo.add("Play video games", True)

my_todo

将渲染:

  1. ☐ 买牛奶
  2. ☐ 做作业
  3. ☑ 玩电子游戏
于 2018-07-29T18:05:03.060 回答
9

扩展上面的@Harmon,看起来你可以将displayandprint语句组合在一起......如果你需要的话。或者,将整个 HTML 格式化为一个字符串然后使用 display.xml 可能更容易。无论哪种方式,不错的功能。

display(HTML('<h1>Hello, world!</h1>'))
print("Here's a link:")
display(HTML("<a href='http://www.google.com' target='_blank'>www.google.com</a>"))
print("some more printed text ...")
display(HTML('<p>Paragraph text here ...</p>'))

输出如下内容:


你好世界!

这是一个链接:

www.google.com

还有一些印刷文字...

段落文字在这里...


于 2017-07-10T18:59:18.003 回答
3

首先,代码:

from random import choices

def random_name(length=6):
    return "".join(choices("abcdefghijklmnopqrstuvwxyz", k=length))
# ---

from IPython.display import IFrame, display, HTML
import tempfile
from os import unlink

def display_html_to_frame(html, width=600, height=600):
    name = f"temp_{random_name()}.html"
    with open(name, "w") as f:
        print(html, file=f)
    display(IFrame(name, width, height), metadata=dict(isolated=True))
    # unlink(name)
    
def display_html_inline(html):
    display(HTML(html, metadata=dict(isolated=True)))

h="<html><b>Hello</b></html>"    
display_html_to_iframe(h)
display_html_inline(h)

一些快速说明:

  • 您通常可以只对简单项目使用内联 HTML。如果你正在渲染一个框架,比如一个大型的 JavaScript 可视化框架,你可能需要使用 IFrame。对于 Jupyter 来说,它很难在没有嵌入随机 HTML 的浏览器中运行。
  • 正如旧文档所暗示的那样,奇怪的参数metadata=dict(isolated=True)不会将结果隔离在 IFrame 中。它似乎可以防止重置所有内容。该标志不再被记录:我只是发现使用它允许某些样式正确呈现。clear-fixdisplay: grid
  • IFrame解决方案写入临时文件。您可以使用此处描述的数据 uri,但这会使调试输出变得困难。JupyterIFrame函数不采用dataorsrcdoc属性。
  • tempfile 模块创建不能共享给另一个进程,因此random_name().
  • 如果您使用带有 IFrame 的 HTML 类,则会收到警告。每个会话可能只有一次。
  • 您可以HTML('Hello, <b>world</b>')在单元格的顶层使用它的返回值将呈现。在函数中,display(HTML(...))按上述方式使用。这也使您可以自由混合displayprint调用。
  • 奇怪的是,IFrame 的缩进比内联 HTML 略多。
于 2020-08-21T08:55:53.667 回答
2

要循环执行此操作,您可以执行以下操作:

display(HTML("".join([f"<a href='{url}'>{url}</a></br>" for url in urls])))

这实质上是在循环中创建 html 文本,然后使用 display(HTML()) 构造将整个字符串显示为 HTML

于 2021-01-27T00:09:55.337 回答