0

我正在尝试从维基百科的 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”时,所有重音字符都被错误地呈现,所以我看到类似:Dia de São Valentim。

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

4

1 回答 1

3

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

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

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

Esta página ou secção foi marcada para revisão, ...</p>

您的浏览器可能有办法覆盖页面的默认字符集。例如,使用 Safari,转到查看菜单,然后是文本编码,然后选择 UTF-8,然后:

Esta página ou secção foi marcada para revisão, ...</p>


那么,如何永久修复它?

好吧,您无法真正永久修复它,因为没有正确的方法将非 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 版本编写的,并使用适当的文档类型。但这应该足够好了。

于 2013-07-13T00:43:49.227 回答