python urllib request urlopen请求网页返回bytes类型

我在学习urllib这个库,使用以下代码请求面度的主页,返回的结果为<class 'bytes'>,我尝试了多种方法进行解码,均不成功(报错或为空)
以下为代码:

from urllib import request
f = request.urlopen('http://www.baidu.com/')
print(f.read())
print(type(f.read()))
x = f.read()
print(x.decode(encoding='utf-8'))

以下为输出:
……n</body>n</html>nrnrnrnnrn'
<class 'bytes'>
''
请大佬指点,谢谢!
图片描述

阅读 6.4k
2 个回答

首次调用read()时有返回,之后的调用一直返回b''

>>> f = request.urlopen('http://www.baidu.com/')
>>> f.read()
b'<!DOCTYPE html>\n<!--STATUS OK-->\n\r...(略)...'
>>> f.read()
b''

因此,从你的第二个f.read()开始,都是返回b''了。
这样代码在我这能正确获取网页并解码:

from urllib import request
f = request.urlopen('http://www.baidu.com/')
x = f.read()
print(x.decode(encoding='utf-8'))

http.client.HTTPResponse.read是这样定义的:

def read(self, amt=None):
    if self.fp is None:
        return b""

    if self._method == "HEAD":
        self._close_conn()
        return b""

    if amt is not None:
        # Amount is given, implement using readinto
        b = bytearray(amt)
        n = self.readinto(b)
        return memoryview(b)[:n].tobytes()
    else:
        # Amount is not given (unbounded read) so we must check self.length
        # and self.chunked

        if self.chunked:
            return self._readall_chunked()
...(略)...

第一次read()时,在self._readall_chunked()self.fp被置为None,并关闭了self.fp
因此再次调用read()时,直接返回了b''

不建议使用 urllib 库,推荐 requests 库

import requests
response = requests.get('https://www.baidu.com/')
response.encoding = 'utf-8'
print(response.text)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏