วิธีการฝัง HTML ในเอาท์พุท IPython?


158

เป็นไปได้หรือไม่ที่จะฝังเอาต์พุต HTML ที่แสดงผลไปยังเอาต์พุต IPython

วิธีหนึ่งคือการใช้

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

หรือ (นามแฝงหลายเซลล์ของ IPython)

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

ซึ่งส่งคืนลิงก์ที่จัดรูปแบบแล้ว แต่

  1. การเชื่อมโยงนี้ไม่ได้เปิดเบราว์เซอร์ที่มีหน้าเว็บตัวเองจากคอนโซล โน๊ตบุ๊ค IPython รองรับการเรนเดอร์อย่างซื่อสัตย์
  2. ฉันไม่ทราบวิธีแสดงHTML()วัตถุภายในพูดรายการหรือpandasตารางที่พิมพ์ คุณสามารถทำได้df.to_html()แต่ไม่ต้องสร้างลิงก์ภายในเซลล์
  3. ผลลัพธ์นี้ไม่ได้โต้ตอบในคอนโซล PyCharm Python (เพราะไม่ใช่ QT)

ฉันจะเอาชนะข้อบกพร่องเหล่านี้และทำให้ IPython แสดงผลแบบโต้ตอบได้มากขึ้นอีกเล็กน้อยได้อย่างไร


2
นี่คือสิ่งที่คุณต้องการจะทำอย่างไร ipython.org/ipython-doc/dev/config/integrating.html
cel

@cel มันจัดรูปแบบเอาต์พุต HTML เช่นเดียวกับที่HTML()ทำ แต่ฉันก็ยังไม่สามารถแก้ไขรายการที่ 1 และ 2 ได้
Anton Tarasenko

2
ฉันไม่ใช่ผู้เชี่ยวชาญดังนั้นอาจผิด แต่ฉันรู้สึกว่าการฉีดรหัส html โดยพลการลงไปในการแสดงวัตถุอื่นจะไม่ทำงาน คู่นี้จะตรรกะและการเป็นตัวแทนของวัตถุและอาจไม่ต้องการ แต่คุณแน่ใจว่าสามารถเขียนออบเจ็กต์ wrapper ซึ่งมีออบเจ็กต์ดั้งเดิมและใช้เมธอดrepr_htmlเพื่อจัดเตรียมการแสดง HTML แบบกำหนดเอง
cel

อันที่จริงผมเพียงแค่ขับรถรหัสของคุณและจะทำงานทันทีที่ย้ายไปยังเซลล์ที่แตกต่างกัน ...
Goodword

คำตอบ:


252

ดูเหมือนว่าจะใช้งานได้สำหรับฉัน:

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

เคล็ดลับคือการห่อใน "แสดง" เช่นกัน

แหล่งที่มา: http://python.6.x6.nabble.com/Printing-HTML-within-IPython-Notebook-IPython-specific-prettyprint-tp5016624p5016631.html


2
รุ่นนี้ exeucte javascirpt สามารถ?
Joshua Moore

4
นี่คือลิงค์ไปยังตัวอย่างโน้ตบุ๊กที่แสดงความเป็นไปได้ในการแสดงผล: Rich Output
Romain

1
แสดงผลส่วนที่อนุญาตให้ฉันไปฝัง JavaScript ในโน๊ตบุ๊ค
lamecicle

นี่เป็นวิธีที่เป็นไปได้สำหรับการสร้างเว็บไซต์หรือไม่หากฉันต้องการใช้ Dash และรหัสหลามทั้งหมดของฉันอยู่ในไฟล์ Jupyter .ipynb?
user8322222

สิ่งที่ฉันหมายถึงคือถ้าฉันต้องการสร้างเว็บไซต์ที่มีแดชบอร์ดที่ทำจาก Dash และ Flask และโค้ดของฉันทั้งหมดอยู่ในไฟล์ jupyter .ipynb ฉันสามารถใช้ html และ css แยกใน Atom เพื่อทำส่วนนั้นและเชื่อมโยงไปยัง รหัสในไฟล์ Jupyter หรือรหัสของฉันทั้งหมดต้องอยู่ในไฟล์. Ipynb ขอขอบคุณสำหรับความช่วยเหลือในจุดนี้เนื่องจากฉันยังใหม่กับสิ่งนี้
user8322222

34

เมื่อก่อน Jupyter Notebooks เริ่มลอก JavaScript จากเนื้อหา HTML [ # 3118 ] นี่คือสองวิธี:

ให้บริการ HTML ในเครื่อง

หากคุณต้องการฝังหน้า HTML ด้วย JavaScript บนหน้าของคุณสิ่งที่ง่ายที่สุดที่จะทำคือบันทึกไฟล์ HTML ของคุณไปยังไดเรกทอรีด้วยสมุดบันทึกของคุณแล้วโหลด HTML ดังนี้:

from IPython.display import IFrame

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

ให้บริการ HTML ระยะไกล

หากคุณต้องการโซลูชันที่โฮสต์คุณสามารถอัปโหลดหน้า HTML ของคุณไปที่ "bucket" ของ Amazon Web Services ใน S3 เปลี่ยนการตั้งค่าในที่ฝากข้อมูลนั้นเพื่อให้ที่ฝากข้อมูลโฮสต์เป็นเว็บไซต์คงที่จากนั้นใช้องค์ประกอบ Iframe ในสมุดบันทึกของคุณ:

from IPython.display import IFrame

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

สิ่งนี้จะแสดงเนื้อหา HTML และ JavaScript ใน iframe เช่นเดียวกับที่คุณทำได้บนหน้าเว็บอื่น ๆ :

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


1
ขอบคุณมาก. นั่นคือสิ่งที่ฉันกำลังมองหา ฉันใช้สิ่งนี้เพื่อแสดงแผนภูมิที่มีการโต้ตอบในไซต์บล็อกคงที่ของฉัน
Okroshiashvili

ไฟล์ในเครื่องจะไม่ง่ายกว่าการทิ้งบางอย่างลงใน AWS หรือไม่
vy32

1
มันสมบูรณ์แบบ! สิ่งที่ฉันต้องการ - เพราะฉันต้องการโฮสต์เว็บแอปพลิเคชันทั้งหมดบน Jupyter Notebook จาก Amazon SageMaker ขอบคุณ!
Adi Levin

2
สำหรับเครื่องหมายพิเศษเรียกใช้เว็บเซิร์ฟเวอร์แบบโต้ตอบแบบอะซิงโครนัสจากเซลล์และโต้ตอบกับเพจที่สร้างภายใน iFrame ในเซลล์อื่น!
holdenweb

1
พิสูจน์แนวคิดอย่างง่าย ๆ ที่gist.github.com/holdenweb/fb8de56e33cdfaef9218673915cc7f1c
holdenweb

13

ที่เกี่ยวข้อง: ในขณะที่สร้างคลาสคุณdef _repr_html_(self): ...สามารถใช้เพื่อสร้างการแสดง HTML ที่กำหนดเองของอินสแตนซ์ของมัน:

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

o = Foo()
o

จะแสดงผลเป็น:

สวัสดีชาวโลก !

สำหรับข้อมูลเพิ่มเติมโปรดดูที่เอกสาร IPython ของ

ตัวอย่างขั้นสูง:

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

จะทำให้:

  1. ☐ซื้อนม
  2. hom ทำการบ้าน
  3. ☑เล่นวิดีโอเกม

9

การขยายใน @Harmon ด้านบนดูเหมือนว่าคุณสามารถรวมdisplayและprintคำสั่งเข้าด้วยกัน ... หากคุณต้องการ หรืออาจเป็นการง่ายกว่าที่จะจัดรูปแบบ HTML ทั้งหมดของคุณเป็นสตริงเดียวแล้วใช้การแสดงผล ไม่ว่าจะด้วยวิธีใดคุณลักษณะที่ดี

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

แสดงผลแบบนี้:


สวัสดีชาวโลก!

นี่คือลิงค์:

www.google.com

พิมพ์ข้อความเพิ่มเติมบางส่วน ...

ข้อความย่อหน้าที่นี่ ...


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.