python urllib错误 - AttributeError:'module'对象没有属性'request'

时间:2014-12-08 21:48:44

标签: urllib

我正在尝试一个教程代码,它从网站上获取html代码并打印出来。我在ubuntu上使用python 3.4.0。代码:

import urllib.request
page = urllib.request.urlopen("http://www.brainjar.com/java/host/test.html")
text = page.read().decode("utf8")
print(text)

我看到以前的解决方案并尝试过它们,我也尝试仅导入urllib,但它仍然无效。显示的错误消息如下所示:

Traceback (most recent call last):
File "string.py", line 1, in <module>
import urllib.request
File "/usr/lib/python3.4/urllib/request.py", line 88, in <module>
import http.client
File "/usr/lib/python3.4/http/client.py", line 69, in <module>
import email.parser
File "/usr/lib/python3.4/email/parser.py", line 12, in <module>
from email.feedparser import FeedParser, BytesFeedParser
File "/usr/lib/python3.4/email/feedparser.py", line 27, in <module>
from email import message
File "/usr/lib/python3.4/email/message.py", line 15, in <module>
from email import utils
File "/usr/lib/python3.4/email/utils.py", line 40, in <module>
from email.charset import Charset
File "/usr/lib/python3.4/email/charset.py", line 15, in <module>
import email.quoprimime
File "/usr/lib/python3.4/email/quoprimime.py", line 44, in <module>
from string import ascii_letters, digits, hexdigits
File "/media/saiwal/D89602199601F930/Documents/Copy/codes/python/headfirst/string.py", line 2, in <module>
page = urllib.request.urlopen("http://www.brainjar.com/java/host/test.html")
AttributeError: 'module' object has no attribute 'request'
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 21, in <module>
from urllib.request import urlopen
File "/usr/lib/python3.4/urllib/request.py", line 88, in <module>
import http.client
File "/usr/lib/python3.4/http/client.py", line 69, in <module>
import email.parser
File "/usr/lib/python3.4/email/parser.py", line 12, in <module>
from email.feedparser import FeedParser, BytesFeedParser
File "/usr/lib/python3.4/email/feedparser.py", line 27, in <module>
from email import message
File "/usr/lib/python3.4/email/message.py", line 15, in <module>
from email import utils
File "/usr/lib/python3.4/email/utils.py", line 40, in <module>
from email.charset import Charset
File "/usr/lib/python3.4/email/charset.py", line 15, in <module>
import email.quoprimime
File "/usr/lib/python3.4/email/quoprimime.py", line 44, in <module>
from string import ascii_letters, digits, hexdigits
File "/media/saiwal/D89602199601F930/Documents/Copy/codes/python/headfirst/string.py", line 2, in <module>
page = urllib.request.urlopen("http://www.brainjar.com/java/host/test.html")
AttributeError: 'module' object has no attribute 'request'

Original exception was:
Traceback (most recent call last):
File "string.py", line 1, in <module>
import urllib.request
File "/usr/lib/python3.4/urllib/request.py", line 88, in <module>
import http.client
File "/usr/lib/python3.4/http/client.py", line 69, in <module>
import email.parser
File "/usr/lib/python3.4/email/parser.py", line 12, in <module>
from email.feedparser import FeedParser, BytesFeedParser
File "/usr/lib/python3.4/email/feedparser.py", line 27, in <module>
from email import message
File "/usr/lib/python3.4/email/message.py", line 15, in <module>
from email import utils
File "/usr/lib/python3.4/email/utils.py", line 40, in <module>
from email.charset import Charset
File "/usr/lib/python3.4/email/charset.py", line 15, in <module>
import email.quoprimime
File "/usr/lib/python3.4/email/quoprimime.py", line 44, in <module>
from string import ascii_letters, digits, hexdigits
File "/media/saiwal/D89602199601F930/Documents/Copy/codes/python/headfirst/string.py", line 2, in <module>
page = urllib.request.urlopen("http://www.brainjar.com/java/host/test.html")
AttributeError: 'module' object has no attribute 'request'

1 个答案:

答案 0 :(得分:4)

这看起来像是一个令人讨厌的巧合。

TL; DR:不要将脚本命名为string.py


那么这里发生了什么?

  1. 您正尝试导入urllib.request

  2. urllib.request尝试导入http.client,尝试导入email.parser,尝试导入email.feedparser,尝试导入email.message,尝试导入email.utils,尝试导入email.charset,尝试导入email.quoprimime

  3. email.quoprimime尝试导入string,期望它为the standard Python string module - 但由于当前工作目录优先于标准Python库目录,因此会找到string.py string.py 1}}而是尝试导入它。

  4. 导入urllib.request时,您尝试导入urllib.request。由于仍会导入urllib,因此您仍然可以找回没有request属性的骨架string.py

  5. 因为导入的request因为无法找到apt-get属性而失败,所以异常会重新开始传播。

  6. 但等等,还有更多!由于导入过程中出错,Ubuntu会通过查看您是否缺少dpkg包来尝试提供帮助。如果是这样,它可以说“嘿,看起来你错过了这个模块;想要urllib.request吗?“所以查找相应包的机制已经激活......

  7. ...但查找相应包本身的模块取决于string.py,因此它会尝试导入它,并再次失败...

  8. 简而言之,因为你选择{{1}}作为文件名,你覆盖了the standard string module,这打破了很多其他模块,甚至打破了你失踪时应该有用的模块一个模块,造成了很大的破坏。幸运的是,解决方案很简单:重命名脚本。