更改使用 urllib.request.urlretrieve() 下载的本地存储的 .html 文件的编码

Change encoding for locally stored .html files downloaded with urllib.request.urlretrieve()

我使用以下 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 文件。我尝试了在以下位置找到的解决方案:

Convert Unicode to ASCII without errors in Python

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

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

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

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

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

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

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

但是,不要那样做。 像文本文件一样打开和处理HTML用处不大。 您应该使用 HTML 解析器遍历文档树并提取您需要的任何内容。 Python 的标准库 has one, but you might find Beautiful Soup 更易于使用。