¿Cómo incrustar HTML en la salida de IPython?

158

¿Es posible incrustar la salida HTML representada en la salida de IPython?

Una forma es usar

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

o (alias de celda multilínea IPython)

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

Que devuelven un enlace formateado, pero

  1. Este enlace no abre un navegador con la página web desde la consola . Sin embargo, los portátiles IPython admiten renderizado honesto.
  2. No sé cómo representar el HTML()objeto dentro de, por ejemplo, una lista o pandastabla impresa. Puedes hacerlo df.to_html(), pero sin hacer enlaces dentro de las celdas.
  3. Este resultado no es interactivo en la consola PyCharm Python (porque no es QT).

¿Cómo puedo superar estas deficiencias y hacer que la salida de IPython sea un poco más interactiva?

Anton Tarasenko
fuente
2
¿Es esto lo que quieres hacer? ipython.org/ipython-doc/dev/config/integrating.html
cel
@cel Formatea la salida html al igual que lo HTML()hace, pero todavía no pude resolver los elementos 1 y 2.
Anton Tarasenko
2
No soy un experto, así que esto podría estar mal, pero siento que inyectar código html arbitrario en la representación de otros objetos no funcionará. Esto acoplaría la lógica y la representación de un objeto y probablemente no sea deseable. Pero seguro que podría escribir objetos de contenedor, que contienen el objeto original y utilizar el método repr_html para proporcionar una representación html personalizada.
cel
En realidad, acabo de ejecutar su código y funcionó tan pronto como me mudé a una celda diferente ...
Goodword
Agregar JavaScript: stackoverflow.com/questions/16852885/…
Anton Tarasenko

Respuestas:

252

Esto parece funcionar para mí:

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

El truco es envolverlo también en "pantalla".

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

Harmon
fuente
2
¿Puede esta versión ejecutar javascirpt?
Joshua Moore
44
Aquí hay un enlace a un cuaderno de ejemplos que muestra las posibilidades de visualización: Salida enriquecida
Romain
1
La parte de la pantalla me permitió incrustar JavaScript en un cuaderno
lamecicle
¿Es este un método factible para producir un sitio web si necesito hacerlo con Dash y todo mi código de Python está en el archivo .ipynb de Jupyter?
user8322222
Lo que quise decir es que si necesito crear un sitio web que contenga un tablero de instrumentos hecho de Dash and Flask y todo mi código esté en archivos jupyter .ipynb, ¿puedo usar archivos html y css separados en Atom para hacer esa parte y vincularlo a el código en los archivos Jupyter o todo mi código debe estar en el archivo .Ipynb. Agradecería cualquier ayuda en este punto, ya que soy nuevo en esto.
user8322222
34

Hace algún tiempo, Jupyter Notebooks comenzó a quitar JavaScript del contenido HTML [ # 3118 ]. Aquí hay dos soluciones:

Servir HTML local

Si desea incrustar una página HTML con JavaScript en su página ahora, lo más fácil es guardar su archivo HTML en el directorio con su cuaderno y luego cargar el HTML de la siguiente manera:

from IPython.display import IFrame

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

Sirviendo HTML Remoto

Si prefiere una solución alojada, puede cargar su página HTML en un "depósito" de Amazon Web Services en S3, cambiar la configuración de ese depósito para que el depósito aloje un sitio web estático, luego use un componente Iframe en su cuaderno:

from IPython.display import IFrame

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

Esto representará su contenido HTML y JavaScript en un iframe, tal como puede hacerlo en cualquier otra página web:

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

duhaime
fuente
1
Muchas gracias. Eso es lo que estaba buscando. Lo uso para representar gráficos de trama interactivamente en mi sitio de blog estático
Okroshiashvili,
¿No sería más fácil un archivo local que lanzar algo en AWS?
vy32
1
¡Esto es perfecto! Exactamente lo que necesitaba, porque quiero alojar una aplicación web completa en un Jupyter Notebook de Amazon SageMaker. ¡Gracias!
Adi Levin
2
Para obtener marcas adicionales, ejecute un servidor web interactivo de forma asíncrona desde una celda e interactúe con las páginas que crea dentro de un iFrame en otras celdas.
holdenweb
1
Prueba simple de concepto en gist.github.com/holdenweb/fb8de56e33cdfaef9218673915cc7f1c
holdenweb
13

Relacionado: Al construir una clase, def _repr_html_(self): ...se puede usar para crear una representación HTML personalizada de sus instancias:

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

o = Foo()
o

se renderizará como:

Hola mundo !

Para obtener más información, consulte los documentos de IPython .

Un ejemplo avanzado:

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

Rendirá:

  1. ☐ Compre leche
  2. ☐ Hacer la tarea
  3. ☑ Jugar videojuegos
Udi
fuente
9

Ampliando en @Harmon arriba, parece que puedes combinar las declaraciones displayy printjuntas ... si es necesario. O tal vez sea más fácil simplemente formatear todo su HTML como una cadena y luego usar display. De cualquier manera, buena característica.

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

Produce algo como esto:


¡Hola Mundo!

Aquí hay un enlace:

www.google.com

algo más de texto impreso ...

Texto del párrafo aquí ...


Joseph True
fuente