名称错误: 名称'urlopen'未定义。

7

好的,这是我的最后一个问题了。我终于找到了一个打印好且可用的API,但我的问题是如果有人能帮我看看这个并告诉我哪里出错了,那就太好了。

import urllib
import json

request = urlopen("http://api.exmaple.com/stuff?client_id=someid&client_secret=randomsecret")
response = request.read()
json = json.loads(response)
if json['success']:
     ob = json['response']['ob']
     print ("The current weather in Seattle is %s with a temperature of %d") % (ob['weather'].lower(), ob['tempF'])
else:
     print ("An error occurred: %s") % (json['error']['description'])
request.close()

这里是错误信息:


Traceback (most recent call last):
File "thing.py", line 4, in <module>
request = urlopen("http://api.exmaple.com/stuff?client_id=someid&client_secret=randomsecret")
NameError: name 'urlopen' is not defined
3个回答

25

你没有导入 urlopen 这个名称。

既然你正在使用 Python3,你需要使用 urllib.request 模块:

from urllib.request import urlopen
req = urlopen(...)

或明确提到request模块

import urllib.request
req = request.urlopen(...)

在 Python2 中,这将是:

from urllib import urlopen

或者使用urllib.urlopen


注意: 你还覆盖了名称为json的变量,这不是一个好主意。


现在出现了以下错误 Traceback (most recent call last): File "C:/Users/Grant/Desktop/finaly.py", line 1, in <module> from urllib import urlopen ImportError: 无法导入名称urlopen - apples723
我更改了你说的内容,但现在出现了以下错误回溯信息: Traceback (most recent call last): File "C:/Users/Grant/Desktop/finaly.py", line 4, in <module> request = urllib.urlopen("http://api.aerisapi.com/observations/Urbandale,IA?client_id=QD2ToJ2o7MKAX47vrBcsC&client_secret=0968kxX4DWybMkA9GksQREwBlBlC4njZw9jQNqdO") NameError: name 'urllib' is not defined。非常抱歉给你带来麻烦,但我是一个完全新手,在我的树莓派上学习编程,我才刚刚拿到它一周。 - apples723
不要使用urllib.urlopen,而是使用urlopen或request.urlopen。 - Elazar
好的,我已经修改了,但是在运行Python 3时遇到了一个错误。我不得不将response = request.read()更改为response = request.read().decode("utf-8"),但现在出现了这个错误类型错误:不支持的操作数类型(s)%:'nonetype和'tuple'。请帮帮我,我是个彻头彻尾的新手。 - apples723
1
如果我们正在解决其他问题,由于OP使用的是Python 3,因此print是一个函数,因此print("whatever")%stuff不起作用,因为print返回None - DSM
@DSM 没错。但这应该是对原帖的评论(否则,原帖作者不会看到它)。 - Elazar

2

Python不知道你所指的urlopen(第4行)是来自urlliburlopen。你有两个选项:

  1. 告诉Python:这就是urllib.urlopen,替换urlopen
  2. 告诉Python:所有引用urlopen都来自于urllib:将import urllib替换为from urllib import urlopen

第一个错误:Traceback (most recent call last): File "C:/Users/Grant/Desktop/finally2.py", line 4, in <module> request = urllib.urlopen("http://api.aerisapi.com/observations/Urbandale,IA?client_id=QD2ToJ2o7MKAX47vrBcsC&client_secret=0968kxX4DWybMkA9GksQREwBlBlC4njZw9jQNqdO") AttributeError: 'module' object has no attribute 'urlopen'第二个错误:Traceback (most recent call last): File "C:/Users/Grant/Desktop/finally2.py", line 1, in <module> from urllib import urlopen ImportError: cannot import name urlopen - apples723

1

it should be:

import urllib
import json

request  = urllib.urlopen("http://api.example.com/endpoint?client_id=id&client_secret=secret")
response = request.read()
json = json.loads(response)

if json['success']:
     ob = json['response']['ob']
     print ("The current weather in Seattle is %s with a temperature of %d") % (ob['weather'].lower(), ob['tempF'])

else:
     print ("An error occurred: %s") % (json['error']['description'])

request.close()

您没有从urllib库中特别导入urlopen()方法。


我得到了这个错误回溯(Traceback): 文件“C:/Users/Grant/Desktop/finally2.py”,第1行,在<module>中: from urllib import urlopen 导入错误:无法导入名称urlopen - apples723
不是我的建议...请尝试按照上面写的精确运行;我已经测试过它可以工作。 - msturdy
你在运行Python 2还是3?我在运行3。 - apples723
1
我使用的是2.7版本..正如另一个答案所说,你应该在Python 3中使用import urllib.request。这样应该可以让它为你工作。 - msturdy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接