首页 > 解决方案 > 更改使用 urllib.request.urlretrieve() 下载的本地存储的 .html 文件的编码

问题描述

我使用以下 python 代码将 html 文件保存到本地存储:

url = "some_url.html
urllib.request.urlretrieve(url, 'save/to/path')

这成功地保存了扩展名为 .html 的文件。当我尝试使用以下命令打开文件时:

html_doc = open('save/to/path/some_url.html', 'r')

我收到以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 36255: ordinal not in range(128)

我认为这意味着我正在尝试使用 ascii 编解码器读取 utf-8 文件。我尝试了在以下位置找到的解决方案:

在 Python 中将 Unicode 转换为 ASCII 而不会出错

但这以及我发现的其他解决方案似乎仅适用于对文件进行编码以便立即查看而不是保存文件。我找不到可用于更改本地存储文件编码的方法。

标签: pythonfileunicodeutf-8urllib

解决方案


open()函数有一个可选encoding参数。它的默认值取决于平台,但在您的情况下,它显然默认为 UTF-8。

我知道正确的编解码器(例如,来自 HTTP 标头),您可以指定它:

html_doc = open('path/to/file.html', 'r', encoding='cp1252')

如果您不知道它,很可能它已写入文件中。您可以以二进制模式打开文件:

html_doc = open('path/to/file.html', 'rb')

然后尝试找到一个编码声明并在内存中解码整个内容。

但是,不要那样做。像文本文件一样打开和处理 HTML 并没有多大用处。您应该使用 HTML 解析器遍历文档树并提取您需要的任何内容。Python 的标准库有一个,但您可能会发现Beautiful Soup更易于使用。


推荐阅读