如何使用“ with”上下文管理器重做我的代码?

时间:2018-08-23 20:14:58

标签: python python-3.6 urllib

如何使用“ with”上下文管理器重做我的代码? 第一部分就像我想要的那样工作。但是,当我尝试使用with上下文管理器转换代码时,再次出现此错误。

output = wp.decode('utf-8')
AttributeError: 'function' object has no attribute 'decode'
from urllib.request import Request, urlopen
import re

url = 'https://www.timereaction.com/' # Blocked by mod_security

# FIRST part OK

req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()
# print(webpage)
output = webpage.decode('utf-8')
keyword = re.findall('Login', output)

if keyword:
    print(keyword)
else:
    print('EMPTY')

# SECOND part doesn't work :(

'''
def check_keyword():
    req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

    with urlopen(req) as webpage:
        wp = webpage.read
        output = wp.decode('utf-8')
        keyword = re.findall('login', output)

        if keyword:
            print(keyword)
        else:
            print('EMPTY')

check_keyword()
'''

2 个答案:

答案 0 :(得分:4)

您将括号放在wp = webpage.read的结尾。

答案 1 :(得分:1)

您已在with块中编写了此代码:

wp = webpage.read
output = wp.decode('utf-8')

因此wp被分配了一个函数,因此它没有任何decode属性。 您必须使用括号来调用函数read,以便为wp分配一个字符串,如下所示:

 wp = webpage.read()
 output = wp.decode('utf-8')

它有效。