2015-12-31 32 views
5

Sto lavorando con uno script di selenio in cui sto cercando di scaricare un file Excel e dargli un nome specifico. Questo è il mio codice:Il selenio indica il nome del file durante il download

Esiste comunque la possibilità che il file venga scaricato con un nome specifico?

Codice:

#!/usr/bin/python 
from selenium import webdriver 
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile 

profile = FirefoxProfile() 
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream") 
profile.set_preference("browser.download.dir", "C:\\Downloads") 
browser = webdriver.Firefox(firefox_profile=profile) 

browser.get('https://test.com/') 
browser.find_element_by_partial_link_text("Excel").click() # Download file 
+0

Perché non rinominarlo dopo il download Utilizzo del modulo [Shutil] (https://docs.python.org/2/library/shutil.html#module-shutil)? –

+0

Poiché il nome del file ha sempre un nome casuale, desidero nominarlo quando lo sto scaricando. Quindi sarà più facile individuarlo in seguito. – user3580316

risposta

3

Non è possibile specificare il nome del file da scaricare attraverso il selenio. Tuttavia, è possibile scaricare il file, trovare il file più recente nella cartella scaricata e rinominare come si desidera.

Nota: i metodi presi in prestito da ricerche su google potrebbero presentare errori. ma tu hai l'idea.

import os 
import shutil 

filename = max([f for f in os.listdir('c:\downloads')], key=os.path.getctime) 
shutil.move(os.path.join(dirpath,filename),newfilename) 
+2

Questo mi dà "File" /usr/local/Cellar/python/2.7.10_2/Framework/Python.framework/Versions/2.7/lib/python2.7/genericpath.py ", riga 72, in getctime return os. stat (nome file) .st_ctime OSError: [Errno 2] Nessun file o directory di questo tipo: '.localized'' – altabq

0

È possibile scaricare il file e il nome allo stesso tempo utilizzando urlretrieve:

import urllib 

url = browser.find_element_by_partial_link_text("Excel").get_attribute('href') 
urllib.urlretrieve(url, "/choose/your/file_name.xlsx") 
0

C'è qualcosa che vorrei correggere risposta @parishodak:

il nome del file qui sarà solo ritorno il percorso relativo (qui il nome del file) non il percorso assoluto.

Ecco perché @FreshRamen ottenuto il seguente errore dopo:

File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/‌​python2.7/genericpath.py", 
line 72, in getctime return os.stat(filename).st_ctime OSError: 
[Errno 2] No such file or directory: '.localized' 

C'è il codice corretto:

import os 
import shutil 

filepath = 'c:\downloads' 
filename = max([filepath +"\"+ f for f in os.listdir(filepath)], key=os.path.getctime) 
shutil.move(os.path.join(dirpath,filename),newfilename) 
+0

'dirpath' installato in python3, ma un'altra dipendenza è comparsa' cache'. Incapace di trovarlo. Qualche soluzione alternativa? –

0

Spero che questo frammento di codice che non è fonte di confusione. Mi ci è voluto un po 'per creare questo ed è davvero utile, perché non c'è stata una risposta chiara a questo problema, con solo questa libreria.

import os 
import time 
def tiny_file_rename(newname, folder_of download): 
    filename = max([f for f in os.listdir(folder_of download)], key=lambda xa : os.path.getctime(os.path.join(folder_of_download,xa))) 
    if '.part' in filename: 
     time.sleep(1) 
     os.rename(os.path.join(folder_of download, filename), os.path.join(folder_of download, newname)) 
    else: 
     os.rename(os.path.join(folder_of download, filename),os.path.join(folder_of download,newname)) 

Spero che questo salvi la giornata di qualcuno, evviva.

EDIT: Grazie a @Om Prakash che modifica il mio codice, mi ha fatto ricordare che non ho spiegato il codice in modo economico.

L'uso della funzione max([]) potrebbe portare a una condizione di competizione, lasciandovi con file vuoto o danneggiato (lo so per esperienza). Si desidera controllare se il file è stato completamente scaricato, in primo luogo. Ciò è dovuto al fatto che il selenio non aspetta il completamento del download del file, quindi quando controlli l'ultimo file creato, un file incompleto comparirà nell'elenco generato e cercherà di spostare quel file. E anche allora, è meglio aspettare un po 'che il file sia libero da Firefox.