web-dev-qa-db-fra.com

Comment intégrer HTML dans la sortie iPython?

Est-il possible d'incorporer une sortie HTML rendue dans une sortie iPython?

Une façon est d'utiliser

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

ou (alias de cellules multilignes IPython)

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

Ce qui retourne un lien formaté, mais

  1. Ce lien n'ouvre pas un navigateur avec la page Web elle-même de la console. Les ordinateurs portables IPython prennent toutefois en charge le rendu honnête.
  2. Je ne sais pas comment rendre un objet HTML() dans une liste ou une table imprimée pandas. Vous pouvez faire df.to_html(), mais sans créer de liens dans les cellules.
  3. Cette sortie n'est pas interactive dans la console PyCharm Python (car ce n'est pas QT).

Comment puis-je surmonter ces inconvénients et rendre la sortie iPython un peu plus interactive?

116
Anton Tarasenko

Cela semble fonctionner pour moi:

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

L'astuce consiste à l'envelopper également dans "display".

Source: http://python.6.x6.nabble.com/Printing-HTML-within-IPython-Notebook-IPython-specific-prettyprint-tp5016624p5016631.html

178
Harmon

Jupyter Notebooks a commencé il y a quelque temps à supprimer le contenu JavaScript du contenu HTML [ # 3118 ]. Voici deux solutions:

Gestion du code HTML local

Si vous souhaitez maintenant incorporer une page HTML avec JavaScript dans votre page, le plus simple consiste à enregistrer votre fichier HTML dans le répertoire de votre cahier, puis de charger le code HTML comme suit:

from IPython.display import IFrame

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

Servant du HTML distant

Si vous préférez une solution hébergée, vous pouvez télécharger votre page HTML vers un "compartiment" Amazon Web Services dans S3, modifier les paramètres de ce compartiment afin de faire du compartiment héberger un site Web statique, puis utiliser un composant Iframe dans votre cahier:

from IPython.display import IFrame

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

Cela rendra votre contenu HTML et JavaScript dans une iframe, comme vous pouvez le faire sur n'importe quelle page Web:

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

Related: Lors de la construction d'une classe, def _reper_html_(self): ... peut être utilisé pour créer une représentation HTML personnalisée de ses instances:

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

o = Foo()
o

rendra comme:

Bonjour Monde !

Pour plus d’informations, reportez-vous à documentation d’IPython .

Un exemple avancé:

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

Rendra:

  1. ☐ Acheter du lait
  2. ☐ faire ses devoirs
  3. ☑ Jouer à des jeux vidéo
9
Udi

En développant sur @Harmon ci-dessus, vous pouvez combiner les instructions display et print ... si vous en avez besoin. Ou alors, il est peut-être plus facile de formater votre code HTML entier en une seule chaîne, puis d’afficher. De toute façon, fonctionnalité intéressante.

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

Sort quelque chose comme ça:


Bonjour le monde!

Voici un lien:

www.google.com

encore du texte imprimé ...

Texte du paragraphe ici ...


7
Joseph True