Python / HTML - 重音字符无法在浏览器中正确呈现

时间:2013-07-13 00:32:42

标签: python html character-encoding non-ascii-characters

我正在尝试从维基百科的API获取一个页面,并使用Python将该页面打印到文件中。

json_data = json.loads(issue_request(params_html))
document = json_data['parse']['text']['*'].encode('utf-8')
a = open('test.html', 'wb')
a.write(document)

我发出的请求是http://pt.wikipedia.org/w/api.php?action=parse&prop=text&page=Dia_dos_Namorados&format=json

问题在于,当我在浏览器中打开'test.html'时,所有重音字符的呈现都不正确,所以我看到的内容如下:DiadeSão Valentim。

我尝试了各种不同的编码方案,包括编码为'latin-1'或使用编解码器,但到目前为止还没有。有趣的是,如果我在文本编辑器(sublime)中打开文件,重音字符显示正常。它只是在浏览器中看起来很有趣。

1 个答案:

答案 0 :(得分:3)

您将HTML片段保存为UTF-8。

通常,您可以通过在HTTP标头或HTML头中使用Content-Type来指定HTML文档的字符集。但是你没有HTTP(它只是一个文件),或者HTML头部分(它只是一个片段),所以也没办法。所以,你的浏览器必须猜测。

在这种情况下,大多数浏览器都默认使用Latin-1,尽管有些浏览器会使用您的系统字符集,或提供配置它的方法,或者甚至会尝试神奇地猜测。无论如何,如果你的浏览器试图将UTF-8显示为Latin-1,你最终会得到这样的东西:

  

Estapáginaousecção foi marcadapararevisão,...

您的浏览器可能有办法覆盖页面的默认字符集。例如,使用Safari,转到“视图”菜单,然后选择“文本编码”,然后选择“UTF-8”,并执行以下操作:

  

Estapáginaousecçãofomarcadapararevisão,...


那么,你如何永久修复它?

好吧,你无法永久地修复它,因为没有正确的方法将非ASCII数据存储在HTML片段中。事实上,从技术上讲,浏览器甚至不应该将这样的HTML片段显示为文档。

但是,许多浏览器会让您在片段的最顶部放入<meta>标记。所以,这可能只是一个问题:

a.write('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">')
a.write(document)

但是这不适用于所有浏览器,并且不应该工作;它恰好与其中许多人碰巧。

应该合法的是将片段包装在文档中。这可以像下面这样简单:

a.write('''<!DOCTYPE html>
    <html>
    <head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head>
    <body>{}</body>
    </html>'''.format(document))

最好弄清楚页面编写的HTML版本,并使用适当的doctype。但这应该足够好了。