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?


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

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


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>


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


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

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 ...


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.