python urllib error - AttributeError: 'module' object has no attribute 'request'

匿名 (未验证) 提交于 2019-12-03 08:59:04

问题:

I am trying out a tutorial code which fetches the html code form a website and prints it. I'm using python 3.4.0 on ubuntu. The code:

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

I saw previous solutions and tried them, I also tried importing only urllib but it still doesn't work. The error message displayed is as shown:

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:

This looks like a nasty coincidence.

TL;DR: Don’t name your script string.py.


So what’s happening here?

  1. You’re trying to import urllib.request.

  2. urllib.request tries to import http.client, which tries to import email.parser, which tries to import email.feedparser, which tries to import email.message, which tries to import email.utils, which tries to import email.charset, which tries to import email.quoprimime.

  3. email.quoprimime tries to import string, expecting it to be the standard Python string module―but since the current working directory has priority over the standard Python library directories, it finds your string.py instead and tries to import that.

  4. When importing your string.py, you try to import urllib.request. Since urllib.request is still being imported, you get back a skeleton urllib without a request attribute yet.

  5. Because your imported string.py then fails because it can’t find the request attribute, the exception starts propagating back up.

  6. But wait, there’s more! Since there was an error during an import, Ubuntu tries to be helpful by seeing if you’re missing a dpkg package. If so, it could say “hey, it looks like you’re missing this module; want to apt-get it?” So the mechanism for looking up the appropriate package is activated…

  7. …but the module for looking up the appropriate package itself depends on urllib.request, so it tries to import it, and again fails…

In short, because you picked string.py as a file name, you overrode the standard string module, which broke a lot of other modules, and even broke the module that was supposed to be helpful when you were missing a module, causing a whole lot of havoc. Fortunately the solution is easy: rename your script.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!