¿Cómo exportar DataFrame a HTML con encoding utf-8?

Sigo recibiendo:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 265-266: ordinal not in range(128) 

cuando bash

 df.to_html("mypage.html") 

Aquí hay una muestra de cómo reproducir el problema:

 df = pd.DataFrame({"a": [u'Rue du Gu\xc3\xa9, 78120 Sonchamp'], "b": [u"some other thing"]}) df.to_html("mypage.html") 

La lista de elementos en "a" son de tipo "unicode" .

cuando quiero exportarlo a csv funciona porque puedes hacer:

 df.to_csv("myfile.csv", encoding="utf-8") 

Su problema está en otro código. Su código de muestra tiene una cadena Unicode que ha sido decodificada erróneamente como latin1 , Windows-1252 o similar, ya que tiene secuencias UTF-8. Aquí deshago la deencoding incorrecta y el código nuevo como UTF-8, pero querrás encontrar dónde se realiza la deencoding incorrecta:

 >>> s = u'Rue du Gu\xc3\xa9, 78120 Sonchamp' >>> s.encode('latin1').decode('utf8') u'Rue du Gu\xe9, 78120 Sonchamp' >>> print(s.encode('latin1').decode('utf8')) Rue du Gué, 78120 Sonchamp 

Si realmente necesitas mantener el resultado en html, puedes intentar limpiar el código en una matriz numpy antes de escribir to_html.

 df = pd.DataFrame({"a": [u'Rue du Gu\xc3\xa9, 78120 Sonchamp'], "b": [u"some other thing"]}) def clean_unicode(df): *#Transforms the DataFrame to Numpy array* df=df.as_matrix() *#Encode all strings with special characters* for x in np.nditer(df, flags=['refs_ok'], op_flags =['copy', 'readonly']): df[df==x]=str(str(x).encode("latin-1", "replace").decode('utf8')) *#Transform the Numpy array to Dataframe again* df=pd.DataFrame(df) return df df=clean_unicode(df) df.to_html("Results.html') -----> Success! 

El problema está realmente en el uso de df.to_html("mypage.html") para guardar el HTML en un archivo directamente. Si, por el contrario, escribe el archivo usted mismo, puede evitar este error de encoding con pandas.

 html = df.to_html() with open("mypage.html", "w", encoding="utf-8") as file: file.write(html) 

Es posible que también deba especificar el conjunto de caracteres en el encabezado del HTML para que se muestre correctamente en ciertos navegadores (HTML5 tiene UTF-8 como predeterminado):

Este fue el único método que funcionó para mí de los varios que he visto.