【问题标题】:Python 3.1 code and errorPython 3.1 代码和错误
【发布时间】:2010-10-25 20:42:52
【问题描述】:

64 位 VISTA
Python 3.1

from urllib import request
a = request.urlopen('http://www.marketwatch.com/investing/currency/CUR_USDYEN').read(20500)
b = a[19000:20500]
idx_pricewrap = b.find('pricewrap')
context = b[idx_pricewrap:idx_pricewrap+80]
idx_bgLast = context.find('bgLast')
rate = context[idx_bgLast+8:idx_bgLast+15]
print(rate)
回溯(最近一次通话最后): 文件“c:\P31Working\test_urllib.py”,第 4 行,在 idx_pricewrap = b.find('pricewrap') TypeError:期望一个具有缓冲区接口的对象 进程以退出代码 1 终止

我不知道这个错误是什么意思。

请帮忙。

【问题讨论】:

    标签: python-3.x urllib


    【解决方案1】:

    Python 3 在字节和(Unicode)字符串之间的区别方面要严格得多。 urlopen(...).read(...) 的结果当然是bytes 类型的对象,bytes.find 的实现不允许您搜索 Unicode 字符串。在您的情况下,您可以简单地用二进制字符串替换“pricewrap”:

    idx_pricewrap = b.find(b'pricewrap')
    

    同样适用于其他.find 呼叫。 Python 2 会自动对 Unicode 字符串进行编码(更少或更多),但 Python 3 引入了更多您需要注意的限制。

    【讨论】:

    • 非常感谢。在看到您的答案之前,我在文档中找到了一个相关示例,我认为它以不同的方式完成了您的建议。我会回答我自己的问题来说明这一点。
    • @NotSuper:是的,将网站解码为 Unicode 对象也是一个很好的解决方案。实际上这是更好的解决方案,但是对于 HTML 站点,您可能更愿意使用可以自动检测字符集的解析器库(从 HTTP 标头或 HTML 中的字符集定义,而不是假设 UTF-8)。
    • 我想学习如何使用解析器库。你能给我举一些例子吗?我想我可以用 3.1 的功能做到这一点?
    • @NotSuper:有一个名为BeautifulSoup 的著名库可以做到这一点。它有一个与 Python 3.1 兼容的版本。从文档开始,它会自动从 HTML 输入生成 Unicode 字符串,但我不知道如何将“Content-Type”标头传递给它,以防 HTML 本身未声明字符集。我自己没有使用过,但是在 SO 上有很多关于它的问题,所以你可以在这里获得帮助。
    • 谢谢。我会研究一下 BeautifulSoup。
    【解决方案2】:

    我终于在文档中找到了一个相关的例子:

    http://docs.python.org/py3k/library/urllib.request.html?highlight=urllib#examples

    第一个例子给了我一些理解,并引导我修改我的代码

    http://tutoree7.pastebin.com/sUq8s4wh

    这就像一个魅力。

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2015-05-11
      • 2018-04-09
      • 2011-11-28
      相关资源
      最近更新 更多