Python需要一个类似字节的对象,而不是'str'错误

时间:2018-08-05 17:04:32

标签: python python-3.x

我正在尝试编写一个基本的python程序,该程序将价格从雅虎财经的网站上记下来。但是,我遇到一个错误:

failed in the main loop a bytes-like object is required, not 'str'

我尝试在此行中使用编码:

sourceCode.read().decode('utf-8')

但这会导致另一个错误:

failed in the main loop 'bytes' object has no attribute 'read'

任何帮助将不胜感激。完整代码如下:

import time
    import urllib.request
    from urllib.request import urlopen

stocks = ['aapl', 'fb', 'goog']

def keyStats(stock):
  try:
      sourceCode = urllib.request.urlopen('https://finance.yahoo.com/quote/' + stock + '/key-statistics?p=' + stock).read()
      ptb = sourceCode.split('Price/Book</span><!-- react-text: 58 --> <!-- /react-text --><!-- react-text: 59 -->(mrq)<!-- /react-text --><sup aria-label="KS_HELP_SUP_undefined" data-reactid="60"></sup></td><td class="Fz(s) Fw(500) Ta(end)" data-reactid="61">')[1].split('</td>')[0]
      print ('Price to Book Ratio: ', stock, ptb)

  except (Exception) as e:
      print ('failed in the main loop', e)

for newStock in stocks:
  keyStats(newStock)
  time.sleep(1)

1 个答案:

答案 0 :(得分:0)

urlopen返回一个response object,当使用read()进行读取时,它返回一个bytes对象。这是因为通常无法保证HTTP请求是否返回二进制响应或某些可以正确解码为字符串的响应。

例如,如果您确切知道UTF-8中存在响应,或者通过在HTTP响应中显式检查Content-Type标头,则应由您显式解码响应。

所以您需要这样做:

sourceCode = urllib.request.urlopen(url).read().decode()

尝试使用UTF-8将bytes响应解码为字符串(默认情况下)。然后sourceCode将是一个字符串,您可以在其上调用str.split()