Como incorporar HTML na saída IPython?

158

É possível incorporar a saída HTML renderizada na saída IPython?

Uma maneira é usar

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

ou (alias de célula multilinha do IPython)

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

Que retornam um link formatado, mas

  1. Esse link não abre um navegador com a própria página da Web no console . Os notebooks IPython suportam renderização honesta, no entanto.
  2. Não sei como renderizar HTML()objetos em, digamos, uma lista ou pandastabela impressa. Você pode fazer isso df.to_html(), mas sem fazer links dentro das células.
  3. Esta saída não é interativa no console PyCharm Python (porque não é QT).

Como posso superar essas deficiências e tornar a saída do IPython um pouco mais interativa?

Anton Tarasenko
fonte
2
É isso que você quer fazer? ipython.org/ipython-doc/dev/config/integrating.html
cel
@cel Ele formata a saída html como HTML()faz, mas eu ainda não podia resolver os itens 1 e 2.
Anton Tarasenko
2
Não sou especialista, portanto, isso pode estar errado, mas acho que a injeção de código html arbitrário na representação de outros objetos não funcionará. Isso combinaria lógica e representação de um objeto e provavelmente não é desejável. Mas você pode escrever objetos wrapper que contenham o objeto original e usar o método repr_html para fornecer uma representação html personalizada.
cel
Na verdade, eu apenas corri o seu código e funcionou assim que um se mudou para uma célula diferente ...
Goodword
Adicionando JavaScript: stackoverflow.com/questions/16852885/…
Anton Tarasenko

Respostas:

252

Isso parece funcionar para mim:

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

O truque é envolvê-lo também em "exibição".

Origem: http://python.6.x6.nabble.com/Printing-HTML-within-IPython-Notebook-IPython-specific-prettyprint-tp5016624p5016631.html

Harmon
fonte
2
Esta versão pode executar javascirpt?
Joshua Moore
4
Aqui está um link para um exemplo notebook mostrando as possibilidades de exibição: Saída rico
Romain
1
O mostrador parte me permitiu JavaScript incorporar em um notebook
lamecicle
Esse é um método viável para produzir um site, se eu precisar fazê-lo com o Dash e todo o meu código python estiver no arquivo .ipynb do Jupyter?
precisa saber é o seguinte
O que eu quis dizer é que, se eu precisar criar um site com um painel feito com Dash e Flask e todo o meu código estiver em arquivos .ipynb jupyter, posso usar apenas arquivos html e css separados no Atom para fazer essa parte e vinculá-lo a o código nos arquivos Jupyter ou todo o meu código precisa estar no arquivo .Ipynb. Gostaria de receber qualquer ajuda neste ponto, pois sou novo nisso.
precisa saber é o seguinte
34

Algum tempo atrás, os Jupyter Notebooks começaram a remover o JavaScript do conteúdo HTML [ # 3118 ]. Aqui estão duas soluções:

Exibição de HTML local

Se você deseja incorporar uma página HTML com JavaScript na sua página agora, a coisa mais fácil é salvar seu arquivo HTML no diretório do seu notebook e, em seguida, carregar o HTML da seguinte forma:

from IPython.display import IFrame

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

Exibição de HTML remoto

Se você preferir uma solução hospedada, poderá fazer upload da sua página HTML para um "bucket" do Amazon Web Services no S3, alterar as configurações desse bucket para tornar o bucket um site estático e usar um componente Iframe no notebook:

from IPython.display import IFrame

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

Isso renderizará seu conteúdo HTML e JavaScript em um iframe, assim como em qualquer outra página da web:

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

duhaime
fonte
1
Muito obrigado. Era isso que eu estava procurando. Eu uso isso para tornar plotly gráficos de forma interativa no meu blog estática
Okroshiashvili
Um arquivo local não seria mais fácil do que lançar algo na AWS?
vy32
1
Isto é perfeito! Exatamente o que eu precisava - porque eu quero hospedar um aplicativo Web inteiro em um Notebook Jupyter do Amazon SageMaker. Obrigado!
Adi Levin
2
Para obter notas extras, execute um servidor da Web interativo de forma assíncrona a partir de uma célula e interaja com as páginas que ele cria dentro de um iFrame em outras células!
holdenweb
1
Prova simples de conceito em gist.github.com/holdenweb/fb8de56e33cdfaef9218673915cc7f1c
holdenweb 31/03
13

Relacionado: Ao construir uma classe, def _repr_html_(self): ...pode ser usado para criar uma representação HTML personalizada de suas instâncias:

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

o = Foo()
o

renderizará como:

Olá Mundo !

Para mais informações, consulte os documentos do IPython .

Um exemplo avançado:

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

Renderizará:

  1. ☐ Compre leite
  2. ☐ Fazer lição de casa
  3. ☑ Jogue videogame
Udi
fonte
9

Expandindo @Harmon acima, parece que você pode combinar o displaye printdeclarações juntos ... se você precisar. Ou talvez seja mais fácil formatar todo o HTML como uma sequência e usar a exibição. De qualquer maneira, bom recurso.

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>'))

Produz algo como isto:


Olá Mundo!

Aqui está um link:

www.google.com

mais algum texto impresso ...

Texto do parágrafo aqui ...


Joseph True
fonte