python - FancyURLOpener 自从迁移到 python 3.1.2 后失败

标签 python python-3.x

我有一个应用程序正在从受密码保护的网站下载 .CSV 文件,然后对其进行进一步处理。

我正在使用 FancyURLOpener,并且只是对用户名和密码进行硬编码。 (显然,在这个特定实例中,安全性并不是一个高优先级)。

自从下载 Python 3.1.2 以来,此代码已停止工作。在解决了它现在位于“request”命名空间中的明显问题之后,它以一种不太明显的方式崩溃了。

有谁知道实现发生的变化以及现在如何使用它?该文档似乎缺少示例。

这是代码的精简版本:

import urllib.request;

class TracOpener (urllib.request.FancyURLopener) :
    def prompt_user_passwd(self, host, realm) :
        return ('andrew_ee', '_my_unenctryped_password')



csvUrl='http://mysite/report/19?format=csv@USER=fred_nukre'

opener = TracOpener();
f = opener.open(csvUrl);  # This is failing!
s = f.read();
f.close();
s;

为了完整起见,以下是整个调用堆栈:

Traceback (most recent call last):
  File "C:\reporting\download_csv_file.py", line 12, in <module>
    f = opener.open(csvUrl);
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1454, in open
    return getattr(self, name)(url)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1628, in open_http
    return self._open_generic_http(http.client.HTTPConnection, url, data)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1624, in _open_generic_http
    response.status, response.reason, response.msg, data)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1640, in http_error
    result = method(url, fp, errcode, errmsg, headers)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1878, in http_error_401
    return getattr(self,name)(url, realm)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1950, in retry_http_basic_auth
    return self.open(newurl)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1454, in open
    return getattr(self, name)(url)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1628, in open_http
    return self._open_generic_http(http.client.HTTPConnection, url, data)
  File "C:\Program Files\Python31\lib\urllib\request.py", line 1590, in _open_generic_http
    auth = base64.b64encode(user_passwd).strip()
  File "C:\Program Files\Python31\lib\base64.py", line 56, in b64encode
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str

最佳答案

这是一个已知错误:http://bugs.python.org/issue8123

关于python - FancyURLOpener 自从迁移到 python 3.1.2 后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2512538/

相关文章:

python - Numpy 方法从卷积核生成线性运算矩阵

python - 由 IndexedRowMatrix().columnSimilarities() 检索的 PySpark 相似性无法访问 : INFO ExternalSorter: Thread * spilling in-memory map

python - 寻找使用python优化文本解析速度的实用解决方案

python - 当我在odoo中选择复选框时如何动态生成新字段?

python - 将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?

python - 无法在google colab中上传本地文件

python-3.x - 将 rgb numpy 图像转换为 rgb 和相应索引值的列表

python - 程序输出错误的东西 '<function score at 0x036374F8>',并且在调用函数并打印时未输出正确的信息

python-3.x - 带有自定义 header 的 urllib.urlretrieve

python - 无法运行 python 脚本 - ImportError : No module named '_chipset'