2012-10-24 53 views
5

我导入了两个库urllibfrom urllib.request import urlopenpython urllib用法

第二个是包含在第一

当我走过去的代码,并试图删除from urllib.request import urlopen线,我得到这个消息:

opnerHTMLnum = urllib.request.build_opener() 
AttributeError: 'module' object has no attribute 'request' 

当我恢复from urllib.request import urlopen行代码运行。

任何人都可以解释为什么吗?

import re 
#import http.cookiejar 
import os.path 
#import time 
#import urllib3 
import urllib 
from urllib.request import urlopen 
import sys 
import smtplib 
from email.mime.text import MIMEText 

# ... 

    opnerHTMLnum = urllib.request.build_opener() 
+1

'urllib2给 '导入错误:关于Python 2.7无模块命名request'。 您使用的是哪个版本的Python? – utapyngo

回答

2

urllib包就是这样一个包。这是__init__.py不导入urllib.request,因此您不能通过仅导入urllib简单地达到urllib.request。它仅作为命名空间使用。

改为导入urllib.request

2

两个import Xfrom X import Y执行任何模块的进口或封装X被给出。

在这种情况下,urllib是一个包。当你import urllib,那么包本身被导入,并且你得到一个引用,但是没有任何子模块被导入(在这种情况下)。当您执行from urllib.request import ...时,Python实际上会导入整个模块urllib.request,但会挑选出您请求的名称并为您提供参考。

如果你不使用urlopen,那么你也可以很容易地做import urllib.request并得到相同的结果。

7

你混淆了python3包urllib.request与Python2.7一个是urllib2。请不要这样做。 Python3和Python2库是不同的。所有你可能需要为从urllib.request里进口urlopen` python2

import urllib2 
from urllib2 import Request 
req = Request("yoururl") 
res = urllib2.urlopen(req) 
+0

我认为OP与标签混淆了;如果他确实在使用Python 2.7,那么会出现导入错误,而不是问题中提到的行为。 –

+0

是的,没错。它被错误标记。 –

+0

好,我正在关注这个例子:http://www.nltk.org/book/ch03.html,我没有意识到引用python3的例子。我的环境是Python 2.7。 +1投票,谢谢! – markc