使用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> '
当然那是行不通的。这是浏览器显示的内容:
如何纠正?
答案 0 :(得分:1)
您在这里拥有的并不是确切的HTML或Pandas问题,而是一个字符集问题。参见https://www.w3schools.com/html/html_charset.asp
您的“拉丁小急性拉丁语”在UTF-8中为0xC3 0xB3。因此,第一个字节为195,第二个字节为179。在上面的链接中,195为“带波浪号的拉丁大写字母A”,而179为“上标3”。这就是为什么您看到ó。
因此Pandas正在生成正确的UTF-8 HTML,但是没有人告诉浏览器。您可以将HTML字符集显式设置为UTF-8,也可以将HTML版本显式设置为5(尽管可能存在特定于浏览器的怪癖,但应该默认将其设置为UTF-8)。
另一种解决此问题的方法可能是从Pandas中获取输出,并在写入文件之前调用calcDT
进行转换。这将写成ó为243,它应该在不更改HTML标头的情况下工作。如果您的文档中包含非ISO-8859-1字符,则绝对不能正确工作,而将其保留为UTF-8格式将支持所有字符。
答案 1 :(得分:0)
我自己的问题的答案很简单,就像在render()方法的输出之前添加这样的标头一样:
outputHTML = '<meta charset="UTF-8">'+df.style.render()
首先,我仍然不明白为什么render()方法不能自动执行此操作。正如John指出的那样,在线上可能有很多文档,但是我无法找到解释。