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

Python需要类似字节的对象,而不是';str';错误,python,python-3.x,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' 任

我正试图编写一个基本的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)
导入时间
导入urllib.request
从urllib.request导入urlopen
股票=['aapl','fb','goog']
def钥匙状态(库存):
尝试:
sourceCode=urllib.request.urlopen('https://finance.yahoo.com/quote/“+stock+”/key statistics?p='+stock).read()
ptb=sourceCode.split('Price/Book(mrq)')[1]。split(''[0]
打印('价格与账面比率:',库存,ptb)
例外情况除外,如e:
打印('在主循环中失败',e)
对于股票中的新闻股:
按键状态(新闻目录)
时间。睡眠(1)
返回一个值,当使用该值读取时,返回一个
字节
对象。这是因为通常无法保证HTTP请求返回的是二进制响应还是可以正确解码为字符串的响应

相反,由您显式地解码响应,例如,如果您确切地知道UTF-8中存在响应,或者通过显式地检查HTTP响应中的内容类型头

所以你需要这样做:

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

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

尝试
ptb=ptb.decode(“utf-8”)
当使用这个时,我仍然会得到:在主循环中,需要一个类似字节的对象,而不是“str”,您是在说“urllib不像它可能那么容易使用”。因此,请改用请求:。此外,在某些情况下,您会发现使用Beautiful Soup比使用split()更容易: