То, что у вас здесь есть, это не проблема 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 будет поддерживать каждый символ.