pandas DataFrame.style.render, когда некоторые строки имеют символы UTF-8 - PullRequest
0 голосов
/ 18 ноября 2018

При использовании dataframe.style акцентированные символы правильно отображаются на Jupyter:

df = pandas.DataFrame([['Madrid', 'León']], index=['Spain'], columns=['BigCity', 'SmallCity'])
df.style    
        BigCity SmallCity
Spain   Madrid  León

Однако, если мы используем метод style.render () для получения HTML-кода и записи его в файл, акцентированные символы кодируются неправильно:

df.style.render()
'<style  type="text/css" >\n</style>  \n<table id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6" > \n<thead>    <tr> \n        <th class="blank level0" ></th> \n        <th class="col_heading level0 col0" >BigCity</th> \n        <th class="col_heading level0 col1" >SmallCity</th> \n    </tr></thead> \n<tbody>    <tr> \n        <th id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6level0_row0" class="row_heading level0 row0" >Spain</th> \n        <td id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6row0_col0" class="data row0 col0" >Madrid</td> \n        <td id="T_a3788466_eb00_11e8_8a82_88e9fe638ee6row0_col1" class="data row0 col1" >León</td> \n    </tr></tbody> \n</table> '

И, конечно, это не работает. Вот что показывает браузер:


enter image description here


Как это можно исправить?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Ответ на мой собственный вопрос так же прост, как добавление к выводу метода render () с таким заголовком:

outputHTML = '<meta charset="UTF-8">'+df.style.render()

FWIW Я до сих пор не понимаю, почему метод render () не делает это автоматически. Джон отмечает, что в Интернете может быть много документации, но я не смог найти объяснения.

0 голосов
/ 18 ноября 2018

То, что у вас здесь есть, это не проблема HTML или Pandas, а проблема набора символов. Смотри https://www.w3schools.com/html/html_charset.asp

Ваш «латинский маленький латинский o с острым» - 0xC3 0xB3 в UTF-8. Поэтому первый байт равен 195, а второй - 179. И вот по ссылке выше 195 - это «латинская заглавная буква A с тильдой», а 179 - «верхний индекс три». Вот почему вы видите ó.

Итак, Pandas производит правильный HTML-код в формате UTF-8, но никто не сообщает браузеру. Вы можете явно установить кодировку HTML на UTF-8 или явно установить версию HTML на 5 (которая по умолчанию должна быть UTF-8, хотя могут быть специфические особенности браузера).

Еще один способ исправить это - взять вывод из Pandas и вызвать .encode('ISO-8859-1'), чтобы преобразовать его перед записью в файл. Это будет писать - как 243, который должен работать без изменения заголовков HTML. Это определенно не будет работать правильно, если у вас когда-либо будет документ, содержащий символы не в ISO-8859-1, тогда как сохранение его в UTF-8 будет поддерживать каждый символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...