【问题标题】:Python; urllib error: AttributeError: 'bytes' object has no attribute 'read'Python; urllib 错误:AttributeError:“字节”对象没有属性“读取”
【发布时间】:2011-09-26 08:57:00
【问题描述】:

注意:这是 Python 3,没有 urllib2。另外,我试过使用 json.loads(),我得到这个错误:

TypeError: can't use a string pattern on a bytes-like object

如果我使用 json.loads() 并从响应中删除 .read(),我会收到此错误:

TypeError: expected string or buffer

>

import urllib.request
import json

response = urllib.request.urlopen('http://www.reddit.com/r/all/top/.json').read()
jsonResponse = json.load(response)

for child in jsonResponse['data']['children']:
    print (child['data']['title'])

不起作用...我不知道为什么。

【问题讨论】:

标签: python python-3.x urllib


【解决方案1】:

我在 python3 中遇到了同样的错误{AttributeError: 'bytes' object has no attribute 'read'}。 这对我有用,后来不使用 json:

from urllib.request import urlopen
from bs4 import BeautifulSoup

url = 'https://someurl/'
page = urlopen(url)
html = page.read()
soup = BeautifulSoup(html)
print(soup.prettify('latin-1'))

【讨论】:

  • 欢迎来到 SO。这个问题已经有一个被高度接受的答案。提出一个替代方案,虽然它可能有效,但实际上并不能解决 OP 中提出的问题,但并不是很有用。见stackoverflow.com/help/how-to-answer
【解决方案2】:

我还不熟悉 python 3,但似乎 urllib.request.urlopen().read() 返回一个 byte 对象而不是字符串。

您可以尝试将其输入到 StringIO 对象中,或者甚至执行 str(response)

【讨论】:

    【解决方案3】:

    试试这个:

    jsonResponse = json.loads(response.decode('utf-8'))
    

    【讨论】:

    • 为我工作!谢谢。
    • 对我来说是json.loads(request.body.decode('utf-8'))
    • 只有3.5版本才有这个bug?
    【解决方案4】:

    使用json.loads 而不是json.load

    load 从类似文件的对象加载,loads 从字符串加载。所以你也可以省略 .read() 调用。)

    【讨论】:

    • 不起作用。如果包含 .read,则会提示此错误:TypeError: can't use a string pattern on a bytes-like object 如果删除 .read(),则会收到此错误:TypeError: expected string or buffer
    猜你喜欢
    • 2022-01-14
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2017-12-29
    • 2020-03-11
    • 2021-09-26
    • 2021-02-26
    相关资源
    最近更新 更多