Jak osadzić HTML w wyjściu IPython?

158

Czy można osadzić wyrenderowane dane wyjściowe HTML w wyjściu IPython?

Jednym ze sposobów jest użycie

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

lub (wielowierszowy alias komórki IPython)

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

Które zwracają sformatowany link, ale

  1. To łącze nie otwiera przeglądarki ze stroną internetową z poziomu konsoli . Notebooki IPython obsługują jednak uczciwe renderowanie.
  2. Nie wiem, jak renderować HTML()obiekt w, powiedzmy, liście lub pandaswydrukowanej tabeli. Możesz to zrobić df.to_html(), ale bez tworzenia linków w komórkach.
  3. To wyjście nie jest interaktywne w konsoli PyCharm Python (ponieważ nie jest to QT).

Jak mogę przezwyciężyć te niedociągnięcia i uczynić wyjście IPython bardziej interaktywnym?

Anton Tarasenko
źródło
2
Czy to jest to, co chcesz zrobić? ipython.org/ipython-doc/dev/config/integrating.html
cel
@cel It formatuje dane wyjściowe html tak samo jak HTML()robi, ale nadal nie mogłem rozwiązać punktów 1 i 2.
Anton Tarasenko
2
Nie jestem ekspertem, więc może to być złe, ale wydaje mi się, że wstrzyknięcie dowolnego kodu HTML do reprezentacji innych obiektów nie zadziała. To połączyłoby logikę i reprezentację obiektu i prawdopodobnie nie jest pożądane. Ale z pewnością można napisać obiekty opakowujące, które zawierają oryginalny obiekt i użyć metody repr_html , aby zapewnić niestandardową reprezentację HTML.
cel
Właściwie właśnie uruchomiłem twój kod i zadziałał, gdy tylko przeniosłem się do innej komórki ...
Goodword
Dodawanie JavaScript: stackoverflow.com/questions/16852885/…
Anton Tarasenko

Odpowiedzi:

252

To wydaje się działać dla mnie:

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

Sztuczka polega na tym, aby zawinąć go również w „wyświetlacz”.

Źródło: http://python.6.x6.nabble.com/Printing-HTML-within-IPython-Notebook-IPython-specific-prettyprint-tp5016624p5016631.html

Harmon
źródło
2
Czy ta wersja może wywołać javascirpt?
Joshua Moore
4
Oto link do przykładowego notatnika pokazującego możliwości wyświetlania: Rich Output
Romain
1
Część wyświetlania pozwoliła mi osadzić JavaScript w notatniku
lamecicle
Czy jest to wykonalna metoda tworzenia strony internetowej, jeśli muszę zrobić to za pomocą Dasha, a cały mój kod w języku Python znajduje się w pliku .ipynb Jupyter?
user8322222
Chodziło mi o to, że jeśli muszę stworzyć stronę internetową zawierającą pulpit nawigacyjny utworzony z Dash i Flask, a cały mój kod znajduje się w plikach jupyter .ipynb, czy mogę po prostu użyć oddzielnych plików html i css w Atom, aby zrobić tę część i połączyć ją z kod w plikach Jupyter lub czy cały mój kod musi znajdować się w pliku .Ipynb. Byłbym wdzięczny za jakąkolwiek pomoc w tej kwestii, ponieważ jestem nowy w tym.
user8322222
34

Jakiś czas temu Jupyter Notebooks zaczęło usuwać JavaScript z treści HTML [ # 3118 ]. Oto dwa rozwiązania:

Udostępnianie lokalnego kodu HTML

Jeśli chcesz teraz osadzić stronę HTML z JavaScriptem na swojej stronie, najłatwiej jest zapisać plik HTML w katalogu z notatnikiem, a następnie załadować HTML w następujący sposób:

from IPython.display import IFrame

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

Udostępnianie zdalnego HTML

Jeśli wolisz rozwiązanie hostowane, możesz przesłać swoją stronę HTML do „zasobnika” Amazon Web Services w S3, zmienić ustawienia tego zasobnika tak, aby zasobnik hostował statyczną witrynę internetową, a następnie użyj komponentu iframe w swoim notatniku:

from IPython.display import IFrame

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

Spowoduje to wyrenderowanie zawartości HTML i JavaScript w ramce iframe, tak jak na każdej innej stronie internetowej:

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

duhaime
źródło
1
Wielkie dzięki. Właśnie tego szukałem. Używam tego do interaktywnego renderowania wykresów fabularnych na moim statycznym blogu
Okroshiashvili
Czy lokalny plik nie byłby łatwiejszy niż wrzucenie czegoś na AWS?
vy32
1
To jest doskonałe! Dokładnie to, czego potrzebowałem - ponieważ chcę hostować całą aplikację internetową na notebooku Jupyter od Amazon SageMaker. Dzięki!
Adi Levin
2
Aby uzyskać dodatkowe znaki, uruchom interaktywny serwer sieciowy asynchronicznie z komórki i wchodź w interakcję ze stronami, które tworzy wewnątrz ramki iFrame w innych komórkach!
holdenweb
1
Prosty dowód słuszności
holdenweb
13

Powiązane: Podczas konstruowania klasy def _repr_html_(self): ...można użyć do utworzenia niestandardowej reprezentacji HTML jej instancji:

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

o = Foo()
o

wyrenderuje się jako:

Witaj świecie !

Więcej informacji można znaleźć w dokumentacji IPythona .

Zaawansowany przykład:

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

Wyrenderuje:

  1. ☐ Kup mleko
  2. ☐ Odrób pracę domową
  3. ☑ Graj w gry wideo
Udi
źródło
9

Rozwijając @Harmon powyżej, wygląda na to, że możesz połączyć oświadczenia displayi printrazem ... jeśli potrzebujesz. A może łatwiej jest po prostu sformatować cały kod HTML jako jeden ciąg, a następnie użyć wyświetlania. Tak czy inaczej, fajna funkcja.

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

Wyświetla coś takiego:


Witaj świecie!

Oto link:

www.google.com

trochę więcej drukowanego tekstu ...

Tekst akapitu tutaj ...


Joseph True
źródło