Bagaimana cara menanamkan HTML ke dalam output IPython?

158

Apakah mungkin untuk menanamkan output HTML yang diberikan ke dalam output IPython?

Salah satu caranya adalah menggunakan

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

atau (alias sel multiline IPython)

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

Yang mengembalikan tautan yang diformat, tetapi

  1. Tautan ini tidak membuka browser dengan halaman web itu sendiri dari konsol . Notebook IPython mendukung rendering yang jujur.
  2. Saya tidak tahu bagaimana cara membuat HTML()objek di dalam, katakanlah, daftar atau pandastabel yang dicetak. Anda bisa melakukannya df.to_html(), tetapi tanpa membuat tautan di dalam sel.
  3. Output ini tidak interaktif di konsol PyCharm Python (karena itu bukan QT).

Bagaimana saya bisa mengatasi kekurangan ini dan membuat keluaran IPython sedikit lebih interaktif?

Anton Tarasenko
sumber
2
Apakah ini yang ingin Anda lakukan? ipython.org/ipython-doc/dev/config/integrating.html
cel
@cel Memformat output html seperti HTML()halnya, tapi saya masih tidak bisa menyelesaikan item 1 dan 2.
Anton Tarasenko
2
Saya bukan ahli, jadi ini bisa salah, tapi saya merasa bahwa menyuntikkan kode html sewenang-wenang ke representasi objek lain tidak akan berfungsi. Ini akan menggabungkan logika dan representasi dari suatu objek dan mungkin tidak diinginkan. Tapi Anda yakin bisa menulis objek wrapper, yang berisi objek asli dan menggunakan metode repr_html untuk memberikan representasi html khusus.
cel
Sebenarnya, saya baru saja menjalankan kode Anda dan itu bekerja segera setelah pindah ke sel yang berbeda ...
Goodword
Menambahkan JavaScript: stackoverflow.com/questions/16852885/…
Anton Tarasenko

Jawaban:

252

Ini sepertinya bekerja untuk saya:

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

Caranya adalah dengan membungkusnya dalam "tampilan" juga.

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

Harmon
sumber
2
Bisakah versi ini menghapus javascirpt?
Joshua Moore
4
Berikut ini adalah tautan ke buku catatan contoh yang menunjukkan kemungkinan tampilan: Rich Output
Romain
1
Bagian tampilan memungkinkan saya untuk menanamkan JavaScript di notebook
tablet
Apakah ini metode yang layak untuk membuat situs web jika saya perlu membuatnya dengan Dash dan semua kode python saya ada di file .ipynb Jupyter?
user8322222
Yang saya maksudkan adalah jika saya perlu membuat situs web yang berisi dasbor yang dibuat dari Dash dan Flask dan semua kode saya ada di file .ipynb jupyter, bisakah saya menggunakan file html dan css terpisah di Atom untuk melakukan bagian itu dan menautkannya ke kode dalam file Jupyter atau apakah semua kode saya harus dalam file .Ipynb. Akan menghargai bantuan apa pun pada titik ini karena saya baru dalam hal ini.
user8322222
34

Beberapa waktu yang lalu Jupyter Notebooks mulai menghapus JavaScript dari konten HTML [ # 3118 ]. Berikut adalah dua solusi:

Melayani HTML Lokal

Jika Anda ingin menyematkan halaman HTML dengan JavaScript di halaman Anda sekarang, hal termudah untuk dilakukan adalah menyimpan file HTML Anda ke direktori dengan notebook Anda dan kemudian memuat HTML sebagai berikut:

from IPython.display import IFrame

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

Melayani Remote HTML

Jika Anda lebih suka solusi yang di-host, Anda dapat mengunggah halaman HTML Anda ke "ember" Layanan Web Amazon di S3, mengubah pengaturan pada ember itu sehingga menjadikan ember menjadi situs web statis, lalu gunakan komponen Iframe di buku catatan Anda:

from IPython.display import IFrame

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

Ini akan membuat konten HTML dan JavaScript Anda dalam iframe, sama seperti yang Anda bisa di halaman web lain:

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

duhaime
sumber
1
Terima kasih banyak. Itu yang saya cari. Saya menggunakan ini untuk membuat grafik plotly secara interaktif di situs blog statis saya
Okroshiashvili
Bukankah file lokal lebih mudah daripada melemparkan sesuatu pada AWS?
vy32
1
Ini sempurna! Persis apa yang saya butuhkan - karena saya ingin meng-host seluruh aplikasi web pada Notebook Jupyter dari Amazon SageMaker. Terima kasih!
Adi Levin
2
Untuk tanda tambahan, jalankan server web interaktif secara tidak sinkron dari sel dan berinteraksi dengan halaman yang dibuatnya di dalam iFrame di sel lain!
holdenweb
1
Bukti konsep sederhana di gist.github.com/holdenweb/fb8de56e33cdfaef9218673915cc7f1c
holdenweb
13

Terkait: Saat membangun kelas, def _repr_html_(self): ...dapat digunakan untuk membuat representasi HTML khusus untuk instance-nya:

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

o = Foo()
o

akan dirender sebagai:

Halo Dunia !

Untuk info lebih lanjut lihat dokumen IPython .

Contoh lanjutan:

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

Will render:

  1. ☐ Beli susu
  2. ☐ Kerjakan pekerjaan rumah
  3. ☑ Mainkan permainan video
Udi
sumber
9

Memperluas pada @Harmon di atas, sepertinya Anda dapat menggabungkan displaydan printpernyataan bersama ... jika perlu. Atau, mungkin lebih mudah untuk hanya memformat seluruh HTML Anda sebagai satu string dan kemudian menggunakan tampilan. Either way, fitur yang bagus.

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

Keluaran sesuatu seperti ini:


Halo Dunia!

Berikut tautannya:

www.google.com

beberapa teks tercetak lagi ...

Teks paragraf di sini ...


Joseph True
sumber