如何修复 "导入错误,没有名为 urllib2 的模块"?

157 阅读4分钟

问题陈述: 如何解决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.requesturllib.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 "的模块的不同方法。我们希望你觉得这个教程很有帮助。