Come incorporare HTML nell'output di IPython?


158

È possibile incorporare l'output HTML renderizzato nell'output IPython?

Un modo è usare

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

o (alias di cella multilinea IPython)

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

Che restituiscono un collegamento formattato, ma

  1. Questo collegamento non apre un browser con la stessa pagina Web dalla console . Tuttavia, i notebook IPython supportano un rendering onesto.
  2. Non sono a conoscenza di come rendere l' HTML()oggetto all'interno, per esempio, di un elenco o di una pandastabella stampata. Puoi farlo df.to_html(), ma senza creare collegamenti all'interno delle celle.
  3. Questo output non è interattivo nella console PyCharm Python (perché non è QT).

Come posso superare queste carenze e rendere l'output di IPython un po 'più interattivo?


2
È questo quello che vuoi fare? ipython.org/ipython-doc/dev/config/integrating.html
cel

@cel Formatta l'output html proprio come HTML()fa, ma non riuscivo ancora a risolvere gli elementi 1 e 2.
Anton Tarasenko,

2
Non sono un esperto, quindi potrebbe essere sbagliato, ma sento che l'iniezione di codice HTML arbitrario nella rappresentazione di altri oggetti non funzionerà. Ciò accoppierebbe la logica e la rappresentazione di un oggetto e probabilmente non è desiderabile. Ma sicuramente potresti scrivere oggetti wrapper, che contengono l'oggetto originale e utilizzare il metodo repr_html per fornire una rappresentazione html personalizzata.
cel

In realtà, ho appena eseguito il tuo codice e ha funzionato non appena si è passati a una cella diversa ...
Goodword

Risposte:


253

Questo sembra funzionare per me:

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

Il trucco è avvolgerlo anche in "display".

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


2
Questa versione può esaltare javascirpt?
Joshua Moore,

4
Ecco un link a un notebook di esempio che mostra le possibilità di visualizzazione: Rich Output
Romain

1
La parte del display mi ha permesso di incorporare JavaScript in un notebook
lamecicle

È un metodo possibile per produrre un sito Web se devo crearlo con Dash e tutto il mio codice Python è nel file .ipynb di Jupyter?
user8322222

Quello che volevo dire è se ho bisogno di creare un sito Web contenente una dashboard fatta da Dash and Flask e tutto il mio codice è in file jupyter .ipynb, posso semplicemente usare un file HTML e CSS separato in Atom per fare quella parte e collegarlo a il codice nei file Jupyter o tutto il mio codice deve essere nel file .Ipynb. Gradirei qualsiasi aiuto su questo punto poiché sono nuovo a questo.
user8322222

34

Qualche tempo fa i notebook Jupyter hanno iniziato a rimuovere JavaScript dal contenuto HTML [ # 3118 ]. Ecco due soluzioni:

Serve HTML locale

Se vuoi incorporare una pagina HTML con JavaScript sulla tua pagina ora, la cosa più semplice da fare è salvare il tuo file HTML nella directory con il tuo notebook e quindi caricare l'HTML come segue:

from IPython.display import IFrame

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

Serve HTML remoto

Se preferisci una soluzione ospitata, puoi caricare la tua pagina HTML su un "bucket" di Amazon Web Services in S3, modificare le impostazioni su quel bucket in modo da rendere il bucket host un sito Web statico, quindi utilizzare un componente Iframe nel tuo notebook:

from IPython.display import IFrame

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

Questo renderà il tuo contenuto HTML e JavaScript in un iframe, proprio come puoi su qualsiasi altra pagina web:

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


1
Molte grazie. Questo è quello che stavo cercando. Lo uso per visualizzare interattivamente diagrammi di trama nel mio blog statico
Okroshiashvili,

Un file locale non sarebbe più semplice che lanciare qualcosa su AWS?
vy32

1
Questo è perfetto! Esattamente quello di cui avevo bisogno, perché voglio ospitare un'intera applicazione Web su un notebook Jupyter di Amazon SageMaker. Grazie!
Adi Levin

2
Per ulteriori punti, esegui un server Web interattivo in modo asincrono da una cella e interagisci con le pagine che crea all'interno di un iFrame in altre celle!
holdenweb


13

Correlati: durante la costruzione di una classe, def _repr_html_(self): ...possono essere utilizzati per creare una rappresentazione HTML personalizzata delle sue istanze:

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

o = Foo()
o

verrà visualizzato come:

Ciao mondo !

Per ulteriori informazioni, consultare i documenti di IPython .

Un esempio avanzato:

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

Renderà:

  1. ☐ Acquista latte
  2. ☐ Fai i compiti
  3. ☑ Gioca ai videogiochi

9

Ampliando @Harmon sopra, sembra che si possono combinare l' displaye printdichiarazioni insieme ... se avete bisogno. Oppure, forse è più semplice formattare l'intero HTML come una stringa e quindi utilizzare display. Ad ogni modo, bella funzionalità.

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

Emette qualcosa del genere:


Ciao mondo!

Ecco un link:

www.google.com

ancora un po 'di testo stampato ...

Testo del paragrafo qui ...


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.