【问题标题】:AttributeError: module 'urllib' has no attribute 'parse'AttributeError:模块 'urllib' 没有属性 'parse'
【发布时间】:2017-05-20 23:26:02
【问题描述】:

python 3.5.2

代码 1

import urllib
s = urllib.parse.quote('"')
print(s) 

它给出了这个错误:

AttributeError: 模块 'urllib' 没有属性 'parse'

代码 2

from urllib.parse import quote  
# import urllib
# s = urllib.parse.quote('"')
s = quote('"')
print(s) 

它有效...

code3

from flask import Flask
# from urllib.parse import quote  
# s = quote('"')
import urllib
s = urllib.parse.quote('"')
print(s) 

它也有效。因为烧瓶?

为什么我没有错误了?是bug吗?

【问题讨论】:

  • 您必须import urllib.parse。我会假设Flask 也导入urllib.parse,这就是您的第三个示例有效的原因。
  • 由于某种原因,这在 IPython 中工作得很好,但在 Python 脚本中失败。 $ ipython Python 3.7.1 (default, Dec 13 2018, 11:43:05) Type 'copyright', 'credits' or 'license' for more information IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: import urllib In [2]: urllib.parse.quote('foo bar') Out[2]: 'foo%20bar'。我不确定为什么它在那里工作。

标签: python urllib python-3.5


【解决方案1】:

urllib 包仅用作命名空间。 urllib 下还有其他模块,例如 requestparse
为了优化导入urllib 不会导入它下面的其他模块。因为这样做会消耗处理器周期和内存,但人们可能不需要那些其他模块。
urllib 下的各个模块必须根据需要单独导入。

尝试这些,第一个失败,但第二个成功,因为当 flask 被导入时 flask 本身导入 urllib.parse

python3 -c 'import urllib, sys;print(sys.modules["urllib.parse"])'
python3 -c 'import flask, sys;print(sys.modules["urllib.parse"])'

【讨论】:

    【解决方案2】:

    要使 代码 1 工作,您需要导入 urllib.parse 模块,而不是函数 quote。这样您就可以使用完整的模块限定符来引用 quote 函数。通过这种方法,您可以使用parse 模块中定义的任何函数:

    import urllib.parse
    s = urllib.parse.quote('"')
    print(s)
    

    代码 2 有效,因为您只导入 parse 函数并在没有模块限定符的情况下引用它,因为它不是在模块的上下文中导入的。使用这种方法,您只能使用来自 parse 模块的显式导入函数。

    代码 3 有效,因为 flask 隐式导入 urllib.parse 模块。 parse 模块在 urllib 模块上下文中可用。导入 urllib 后,urllib.parse 就可以随时使用,您可以像在 代码 1

    中一样使用它

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,并意识到这是一个版本问题。所以这是我的解决方案,以防它帮助任何人:

      # For Python 2.X
      urllib.quote_plus(query)
      
      # For Python 3.x
      urllib.parse.quote_plus(query)
      

      参考https://github.com/schollz/playlistfromsong/issues/36

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 2018-04-14
        • 2019-02-18
        • 1970-01-01
        • 2020-01-01
        • 2017-05-07
        • 2019-07-20
        • 2021-11-05
        相关资源
        最近更新 更多