AttributeError: el objeto 'módulo' no tiene atributo 'urlretrieve'

81

Estoy tratando de escribir un programa que descargue mp3 de un sitio web y luego los junte, pero cada vez que intento descargar los archivos, aparece este error:

Traceback (most recent call last):
File "/home/tesla/PycharmProjects/OldSpice/Voicemail.py", line 214, in <module> main()
File "/home/tesla/PycharmProjects/OldSpice/Voicemail.py", line 209, in main getMp3s()
File "/home/tesla/PycharmProjects/OldSpice/Voicemail.py", line 134, in getMp3s
raw_mp3.add = urllib.urlretrieve("http://www-scf.usc.edu/~chiso/oldspice/m-b1-hello.mp3")
AttributeError: 'module' object has no attribute 'urlretrieve'

La línea que está causando este problema es

raw_mp3.add = urllib.urlretrieve("http://www-scf.usc.edu/~chiso/oldspice/m-b1-hello.mp3")
Sike1217
fuente

Respuestas:

208

Como está usando Python 3, ya no hay módulo urllib. Se ha dividido en varios módulos.

Esto sería equivalente a urlretrieve:

import urllib.request
data = urllib.request.urlretrieve("http://...")

urlretrieve se comporta exactamente de la misma manera que lo hizo en Python 2.x, por lo que funcionará bien.

Básicamente:

  • urlretrieve guarda el archivo en un archivo temporal y devuelve una tupla (filename, headers)
  • urlopendevuelve un Requestobjeto cuyo readmétodo devuelve una cadena de bytes que contiene el contenido del archivo
dom0
fuente
2
Si quisiera descargar los archivos .mp3 en una lista, ¿seguiría funcionando?
Sike1217
3
Se encontró con este error al trabajar con el tutorial de aprendizaje automático de tensorflow de Google (soy nuevo en Python, por lo que su respuesta es muy apreciada) tensorflow.org/tutorials/mnist/beginners/index.md
Chris Smith
10

Una solución compatible con Python 2 + 3 es:

import sys

if sys.version_info[0] >= 3:
    from urllib.request import urlretrieve
else:
    # Not Python 3 - today, it is most likely to be Python 2
    # But note that this might need an update when Python 4
    # might be around one day
    from urllib import urlretrieve

# Get file from URL like this:
urlretrieve("http://www-scf.usc.edu/~chiso/oldspice/m-b1-hello.mp3")
Martín Thoma
fuente
@ tim654321 Lo cambié. Tiene razón, existe la posibilidad de que esto sea lo mismo para Python 3 y versiones posteriores.
Martin Thoma
Un comentario a su comentario ("No es Python 3 ..."): Ya que está revisando >= 3, la preocupación con respecto a Python4 no es válida.
Martin R.
@MartinR. o más bien, ..., las notas sobre Python 4 deberían estar en el >= 3bloque.
Jesse Chisholm
4

Suponga que tiene las siguientes líneas de código

MyUrl = "www.google.com" #Your url goes here
urllib.urlretrieve(MyUrl)

Si recibe el siguiente mensaje de error

AttributeError: module 'urllib' has no attribute 'urlretrieve'

Entonces deberías probar el siguiente código para solucionar el problema:

import urllib.request
MyUrl = "www.google.com" #Your url goes here
urllib.request.urlretrieve(MyUrl)
Amir Md Amiruzzaman
fuente