Python urllib使用指南

5

我导入了两个库 urllibfrom urllib.request import urlopen

第二个在第一个库里面。

当我检查代码并试图删除 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
在Python 2.7上,from urllib.request import urlopen会报错:ImportError: No module named request。请问您使用的是哪个版本的Python? - utapyngo
3个回答

7

您可能将Python3包urllib.request与Python2.7中的urllib2混淆了。请不要这样做。Python3和Python2是不同的库。您需要的只是来自python2的urllib2

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

我认为OP对标签感到困惑了;如果他真的在使用Python 2.7,那么就会出现导入错误,而不是问题中所述的行为。 - Martijn Pieters
很好的发现,我一直在跟随这个例子:http://www.nltk.org/book/ch03.html,但我没有意识到这些例子是针对Python3的。我的环境是Python 2.7。已投+1票,谢谢! - markc

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并获得相同的结果。

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