【问题标题】:Python A Bytes-like object is required, not 'str' Error [duplicate]Python需要一个类似字节的对象,而不是'str'错误[重复]
【发布时间】:2018-08-05 17:04:31
【问题描述】:

我正在尝试编写一个基本的 Python 程序,该程序从 yahoo Finance 的网站获取市账率。但是,我收到一个错误:

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)

【问题讨论】:

  • 试试ptb = ptb.decode("utf-8")
  • 当使用这个时我仍然得到:在主循环中失败需要一个类似字节的对象,而不是'str'
  • 您是在说“urllib 没有它应该的那么容易使用”。所以请改用请求:pypi.org/project/requests。此外,在某些时候,您会发现使用 Beautiful Soup 比使用 split() 更容易:crummy.com/software/BeautifulSoup/bs4/doc

标签: python python-3.x


【解决方案1】:

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

相反,您可以明确解码响应,例如,如果您确切知道有 UTF-8 响应,或者通过明确检查 HTTP 响应中的 Content-Type 标头。

所以你需要这样做:

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

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

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2020-07-16
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多