如何将HTML嵌入到iPython输出中?

时间:2014-09-06 08:36:40

标签: python html ipython jupyter-notebook

是否可以将渲染的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)。
  4. 如何克服这些缺点并使iPython输出更具互动性?

6 个答案:

答案 0 :(得分:160)

这似乎对我有用:

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

答案 1 :(得分:8)

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

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

o = Foo()
o

将呈现为:

  

你好世界

有关更多信息,请参见IPython's docs

一个高级示例:

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. ☐做作业
  4.     
  5. ☑玩视频游戏
  6.   

答案 2 :(得分:7)

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

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

更多印刷文字......

这里的段落文字......

答案 3 :(得分:2)

首先,代码:

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)不能如older documentation所示在IFrame中隔离结果。看来可以防止clear-fix重置所有内容。该标记不再记录:我刚刚发现使用它可以允许某些display: grid样式正确呈现。
  • IFrame解决方案将写入一个临时文件。您可以按照here的说明使用数据uri,但这会使调试输出变得困难。 Jupyter IFrame函数不具有datasrcdoc属性。
  • tempfile 模块创建不可与其他进程共享,因此random_name()无法共享。
  • 如果您将HTML类与IFrame一起使用,则会收到警告。每个会话可能只有一次。
  • 您可以在单元格的顶层使用HTML('Hello, <b>world</b>'),它将返回其返回值。在函数中,如上操作,使用display(HTML(...))。这也使您可以自由地混合displayprint呼叫。
  • 奇怪的是,iframe的缩进量比嵌入式HTML略多。

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:-2)

我一直在寻找一个Jupyter笔记本特定的答案而无法找到答案,所以我就把它留在这里:

Jupyter笔记本降价单元格渲染html标签:

<a href="your_link_here.com">Your text here!</a>