2017-01-30 1 views
0

Repro:pandas géants dataframe rendu en html apparaît bizarrement (avec des balises littérale) lorsqu'il est inclus dans le site jekyll

  1. Create a new jekyll site
  2. Créer un carnet ipython, test.ipynb, avec le contenu suivant et l'exécuter :

    import pandas as pd  
    df = pd.DataFrame([[4,5]], columns=['A', 'B']) 
    df 
    
  3. Run jupyter nbconvert --to html --template basic test.ipynb

  4. Copiez lefichiercréé à l'étape précédente dans le répertoire _includes sous la racine du site jekyll
  5. Modifier le fichier par défaut welcome-to-jekyll.markdown sous _posts pour ajouter la ligne: {% include test.html %}
  6. Run jekyll serve et accédez au poste échantillon

Je m'attends à voir une représentation de table de ma base de données telle qu'elle apparaît dans mon cahier iPython. Ce que je reçois réellement est un désordre où certaines balises sont interprétées de manière appropriée et certaines sont simplement rendues en tant que texte. Il ressemble à:

<th id="T_6c043882_e6d3_11e6_badf_889ffafd94e7" class="row_heading level0 row0" rowspan=1> 0 
<th class="col_heading level0 col0" colspan=1> A <th class="col_heading level0 col1" colspan=1> B 
4 5 

Répondre

1

Le problème est avec les attributs tels que colspan=1 générés par pandas géants. La citation de valeurs d'attribut est facultative en HTML5, mais not in XHTML. L'analyseur syntaxique par défaut utilisé dans jekyll prend uniquement en charge le langage XHTML valide.

La meilleure solution que j'ai trouvé est de normaliser le code HTML dans le bloc-notes. dire remplacer la ligne avec juste df ci-dessus avec quelque chose comme ...

import IPython.core.display as di 
from BeautifulSoup import BeautifulSoup as BS 
def sanitize_style(s): 
    soup = BS(s.render()) 
    return soup.prettify() 

di.display(di.HTML(sanitize_style(df.style))) 

Pointe du chapeau à this answer pour l'idée d'utiliser BeautifulSoup pour normaliser HTML. En plus d'encapsuler les valeurs d'attribut non-cotées, il permet également de fermer des balises non fermées, ce qui n'est pas un problème dans l'exemple minimal ci-dessus, mais peut causer des problèmes avec des exemples plus complexes. Si vous voulez rendre beaucoup de telles tables, il peut être utile d'effectuer la normalisation plus en aval en utilisant un fichier de configuration nbconvert personnalisé, afin de ne pas avoir à répéter beaucoup de messages dans le code du bloc-notes. .

Vous pouvez également essayer de passer de l'analyseur kramdown à redcarpet (changer la ligne markdown: kramdown-markdown: redcarpet dans _config.yml et ajoutez à votre gem 'redcarpet' Gemfile). Cela a résolu mes problèmes XHTML mais a introduit quelques bizarreries sans rapport. Notez également que as of May 2016, Github-pages will only support kramdown.