问题陈述: 如何解决Python的错误--"导入错误。没有名为 urllib2 的模块 "?
一个温和的介绍
URL是统一资源定位器的缩写。基本上,URL是用来识别互联网上的资源的。为了从互联网上获取URL并使用URL中的数据,在Python2中使用了urllib2 标准的Python模块。urllib2 模块支持很多函数和类,帮助用户打开URL并提取其内容。然而,在Python3中,urllib2 模块是不可用的。相反,该模块被分割成几个子模块,如urllib.request,urllib.error 。
如果导入语句在成功导入一个模块时遇到困难,它会引发一个ImportError。通常,这样的问题是由于错误的安装或无效的路径造成的,在Python 3.6 和更新的版本中通常会引发ModuleNotFoundError。
例子:在下面的例子中,我们看到出现了 "ModuleNotFoundError:没有名为'urllib2'的模块"

现在,让我们继续解决这个错误吧!
解决方案 1:使用 import urllib.。
在这种情况下发生错误是因为urllib2 模块在 Python 3 中被分割成几个模块,名为urllib.request和urllib.error。因此,导入时无法找到任何名为urllib2 的模块。如果是 Python 2,那么我们的例子就会产生预期的输出。不幸的是,在这种情况下,我们在 Python 3 上,需要在这里使用一个不同的模块。
翻阅不同的模块,确定要使用的函数。这里我们将导入包含所需函数的模块。
1.如果你想使用urlopen() 函数,那么你必须导入urllib.request模块。
例子:
from urllib.request import urlopen
#fetch the contents of a URL to handler
res = urlopen("https://blog.finxter.com/")
#read the contents from the handler
content = res.read()
2.如果你想使用urlparse() 函数,那么你必须导入urllib.parse模块。
例子:
from urllib.parse import urlparse
# Parse the URL to extract necessary components
res = urlparse("https://blog.finxter.com/how-to-fix-unicodedecodeerror-when-reading-csv-file-in-pandas-with-python/")
print(res)
输出:
ParseResult(scheme='https', netloc='blog.finxter.com', path='/how-to-fix-unicodedecodeerror-when-reading-csv-file-in-pandas-with-python/', params='', query='', fragment='')
Process finished with exit code 0
解决方案 2: 使用 Try 和 Except 块
当你不确定实际使用的是哪个版本的Python,并且希望你的脚本能在Python 2和Python 3中工作时,你可以包含一个try and except块。
语法:
try:
#For Python 2
import urllib2 as <alias>
except:
# If an error is seen, use the format supported in Python 3
import urllib.<module> as <alias>
例子:如果你想使用urlopen()函数,我们可以有try和except块,如下所示。
try:
#For Python 2
import urllib2 as req
except:
# If an error is seen, use the format supported in Python 3
import urllib.request as req
#fetch the contents of a URL to handler
res = req.urlopen("https://blog.finxter.com/")
#read the contents from the handler
content = res.read()
解释:在一个try 块中,导入与 Python 2 对应的模块,并给它一个别名。在上面的例子中,我们给了一个别名:req 。在except 块中,导入对应于 Python3 的模块,并给出与try 块中相同的别名。无论使用哪个导入语句,别名req都将被分配给它。我们可以使用这个别名来访问程序中的函数。
解决方案3:使用Python 2to3工具
如果你不想手动修改你的脚本,并且在运行脚本时没有看到任何错误,你可以使用内置的2to3工具,它将自动修改Python文件中的导入。
- 2to3是一个Python程序,它读取Python 2.x源代码,并应用一系列的修正器将其转化为有效的Python 3.x代码。在将你的源码转换为Python 3时,2to3会自动调整导入。你可以通过使用同样的方式简单地修改你现有的文件。
- 为了使用2to3工具,打开你的终端,用以下命令安装该工具: pip install 2to3
- 一旦你成功地安装了该工具,打开你的终端并按照这个语法来使用它。
2to3 -w file_name.py
例子:
假设我们有一个名为sample_py2_file.py的文件,内容如下。
from urlib2 import urlopen
# fetch the contents of a URL to handler
res = urlib2.urlopen("https://blog.finxter.com/")
# read the contents from the handler
content = res.read()
print(content)
为了将这个文件转换为Python 3,打开终端窗口,执行下面的命令。
2to3 -w "C:\Users\admin\Desktop\Finxter\venv\Scripts\sample_py2_file.py"
你会看到该工具会将该文件转换为Python 3文件,如下所示:
(venv) C:\Users\admin\Desktop\Finxter>2to3 -w "C:\Users\admin\Desktop\Finxter\venv\Scripts\sample_py2_file.py"
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored C:\Users\admin\Desktop\Finxter\venv\Scripts\sample_py2_file.py
--- C:\Users\admin\Desktop\Finxter\venv\Scripts\sample_py2_file.py (original)
+++ C:\Users\admin\Desktop\Finxter\venv\Scripts\sample_py2_file.py (refactored)
@@ -1,4 +1,4 @@
-import urllib2
+import urllib.request, urllib.error, urllib.parse
#fetch the contents of a URL to handler
res = urlib2.urlopen("https://blog.finxter.com/")
RefactoringTool: Files that were modified:
RefactoringTool: C:\Users\admin\Desktop\Finxter\venv\Scripts\sample_py2_file.py
这些改变将被用于文件sample_py2_file.py。同时,在该文件所在的位置将保留一个备份sample_py2_file.py.bak。
总结
在本教程中,我们看到了在编写新脚本和修改已有脚本的情况下,解决没有名为 "urllib2 "的模块的不同方法。我们希望你觉得这个教程很有帮助。