python - 更改使用 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 而不会出错
但这以及我发现的其他解决方案似乎仅适用于对文件进行编码以便立即查看而不是保存文件。我找不到可用于更改本地存储文件编码的方法。
解决方案
该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更易于使用。
推荐阅读
- splunk - “eval”可以用来设置一个等于搜索字符串的事件吗?
- python - L1-L2 正则化的不同系数
- c# - WPF Canvas 在大量绘制时冻结
- python - NoReverseMatch 与 django-addanother 编辑按钮
- angularjs - 获取 Radio 选择值并在另一个元素中使用 - AngularJS
- java - Java - 比较两个字符串列表是否具有共同值并返回有多少项相同
- android - 如何在 Android 微调器上设置验证(下拉菜单)
- c++ - 通过 C++ 类中的成员函数控制更改成员变量的能力
- angular5 - ngx-smart-modal 参数在 angular5 中不起作用
- c# - 使用 ASP.Net MVC DbContext 进行依赖注入