我正在尝试从维基百科的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)中打开文件,重音字符显示正常。它只是在浏览器中看起来很有趣。
答案 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。但这应该足够好了。