Як вставити 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 Він форматує вихід HTML-файлів так само, як HTML()це робиться, але я все ще не міг вирішити пункти 1 та 2.
Антон Тарасенко

2
Я не експерт, тому це може бути неправильним, але я вважаю, що введення довільного коду html у представлення інших об'єктів не буде працювати. Це поєднало б логіку та представлення об'єкта і, мабуть, не бажано. Але ви впевнені, що можете записати обгорткові об'єкти, що містять оригінальний об'єкт, і використовувати метод repr_html для надання користувальницького представлення html.
віч

Насправді, я просто запустив ваш код, і він спрацював, як тільки перейшов до іншої комірки ...
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
Чи може ця версія виконувати javascirpt?
Джошуа Мур

4
Ось посилання на приклад ноутбука із відображенням можливостей відображення: Різний вихід
Ромен

1
Частина дисплея дозволила мені вставити JavaScript у блокнот
lamecicle

Це здійсненний метод створення веб-сайту, якщо мені потрібно зробити його за допомогою Dash, і весь мій код python знаходиться у файлі Jupyter .ipynb?
користувач8322222

Що я мав на увазі, якщо мені потрібно зробити веб-сайт, що містить інформаційну панель, виготовлену з тире і колби, і весь мій код знаходиться у файлах jupyter .ipynb, чи можу я просто використати окремі html-файли css в Atom, щоб виконати цю частину та зв’язати її код у файлах Юпітера або весь мій код повинен бути у файлі .Ipynb. Буду вдячний за будь-яку допомогу з цього приводу, оскільки я новачок у цьому.
користувач8322222

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 у "відро" веб-служб Amazon в 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
Дуже дякую. Ось що я шукав. Я використовую це для інтерактивного відображення сюжетних діаграм у своєму статичному блозі
Окрошіашвілі,

Невже локальний файл не буде простішим, ніж кинути щось на AWS?
vy32

1
Це прекрасно! Саме те, що мені було потрібно - адже я хочу розмістити цілу веб-програму на ноутбуці Юпітер від Amazon SageMaker. Дякую!
Аді Левін

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. ☐ Робіть домашні завдання
  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

ще трохи друкованого тексту ...

Текст абзацу тут ...


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.