Как встроить 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.
чел
На самом деле, я просто запустил ваш код, и он
заработал,
Добавление JavaScript: stackoverflow.com/questions/16852885/…
Антон Тарасенко

Ответы:

253

Кажется, это работает для меня:

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

Harmon
источник
2
Может ли эта версия exeucte javascirpt?
Джошуа Мур
4
Вот ссылка на пример записной книжки, показывающий возможности отображения: Rich Output
Romain
1
Часть дисплея позволила мне встроить JavaScript в блокнот
lamecicle
Является ли это возможным способом создания веб-сайта, если мне нужно сделать это с помощью Dash, а весь мой код на python находится в файле Jupyter .ipynb?
user8322222
Я имел в виду, что если мне нужно создать веб-сайт, содержащий панель мониторинга, созданную из Dash и Flask, и весь мой код находится в файлах jipyter .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-страницу в «корзину» 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>

duhaime
источник
1
Большое спасибо. Это то, что я искал. Я использую это для интерактивного рендеринга графиков на моем статическом блог-сайте
Окрошиашвили,
Разве локальный файл не будет проще, чем что-то добавить в AWS?
vy32
1
Это потрясающе! Именно то, что мне было нужно - потому что я хочу разместить целое веб-приложение на ноутбуке Jupyter от 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

еще немного печатного текста ...

Текст абзаца здесь ...


Иосиф Истинный
источник