Usando urlopen para abrir la lista de urls

Tengo un script en python que recupera una página web y la refleja. Funciona bien para una página específica, pero no puedo hacer que funcione para más de una. Asumí que podría poner varias URL en una lista y luego enviarlas a la función, pero recibo este error:

Traceback (most recent call last): File "autowget.py", line 46, in  getUrl() File "autowget.py", line 43, in getUrl response = urllib.request.urlopen(url) File "/usr/lib/python3.2/urllib/request.py", line 139, in urlopen return opener.open(url, data, timeout) File "/usr/lib/python3.2/urllib/request.py", line 361, in open req.timeout = timeout AttributeError: 'tuple' object has no attribute 'timeout' 

Aquí está el código ofensivo:

 url = ['https://www.example.org/', 'https://www.foo.com/', 'http://bar.com'] def getUrl(*url): response = urllib.request.urlopen(url) with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file: shutil.copyfileobj(response, out_file) getUrl() 

He agotado Google tratando de encontrar cómo abrir una lista con urlopen (). Encontré una forma en que funciona ese tipo de obras. Toma un documento .txt y lo recorre línea por línea, alimentando cada línea como una URL, pero lo estoy escribiendo usando Python 3 y por cualquier motivo no se importará twillcommandloop . Además, ese método es poco manejable y requiere (supuestamente) trabajo innecesario.

De todos modos, cualquier ayuda sería muy apreciada.

En tu código hay algunos errores:

  • Usted define getUrls con la lista de argumentos variables (la tupla en su error);
  • Administra los argumentos de getUrls como una sola variable (lista en su lugar)

Puedes probar con este código

 import urllib2 import shutil urls = ['https://www.example.org/', 'https://www.foo.com/', 'http://bar.com'] def getUrl(urls): for url in urls: #Only a file_name based on url string file_name = url.replace('https://', '').replace('.', '_').replace('/','_') response = urllib2.urlopen(url) with open(file_name, 'wb') as out_file: shutil.copyfileobj(response, out_file) getUrl(urls) 

No soporta la tupla:

 urllib.request.urlopen(url[, data][, timeout]) Open the URL url, which can be either a string or a Request object. 

Y tu vocación es incorrecta. Debería ser:

 getUrl(url[0],url[1],url[2]) 

Y dentro de la función, use un bucle como “for u in url” para recorrer todas las urls.

Solo debes iterar sobre tus URL usando un bucle for :

 import shutil import urllib.request urls = ['https://www.example.org/', 'https://www.foo.com/'] file_name = 'foo.txt' def fetch_urls(urls): for i, url in enumerate(urls): file_name = "page-%s.html" % i response = urllib.request.urlopen(url) with open(file_name, 'wb') as out_file: shutil.copyfileobj(response, out_file) fetch_urls(urls) 

Supongo que desea que el contenido se guarde en archivos separados , por lo que utilicé enumerate aquí para crear un nombre de archivo único, pero obviamente puede usar cualquier cosa desde hash() , el módulo uuid para crear slugs .