如何在python中读取selenium webdriver下载的文件

2024-04-29 09:15:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中使用selenium和webdriver从站点下载csv文件。文件被下载到指定的下载目录中。下面是我的代码概述

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir",'xx/yy')
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream")
driver = webdriver.Firefox(fp)
driver.get('url')

我需要print将这个csv的内容发送到终端。很多类似的随机文件会被下载到同一个文件夹中,所以通过文件名访问文件是行不通的,因为我不知道它会是什么


Tags: 文件csv代码textbrowser目录application站点
3条回答

在Selenium中下载文件从来不是一个好主意。你不能控制下载文件的位置和文件名,如果你想知道,那么你必须使用肮脏的黑客。这取决于浏览器及其设置,以及以前是否下载过同一文件。

另外,你必须注意在下载后删除文件,否则,同一文件的许多副本将垃圾邮件你的硬盘驱动器,直到它完全充满。

如果可能的话,你应该打电话给

string downloadUrl = ButtonDownloadPdf.GetAttribute("href");

然后自己处理下载,使用常规方法,而不是Selenium。

您可以从该位置获取最后下载的文件,然后读取该文件:

path = /path to folder
list = os.listdir(path)
time_sorted_list = sorted(list, key=os.path.getmtime)
file_name = time_sorted_list[len(time_sorted_list)-1]

然后你可以从这个文件中读取。希望不会有多个文件通过并行进程到达那里。

编辑: 刚才看到有评论说有多个实例可以下载,所以您可以使用urllib,并使用其url下载文件:

import urllib
urllib.urlretrieve( "http://www.example.com/yourfile.ext", "your-file-name.ext") // you can provide unique-id to your file name

这个答案是由之前的堆栈溢出问题、答案和评论组成的,谢谢大家。

我将selenium webdriver和python请求模块结合在一起实现了这个解决方案。我基本上是使用selenium登录站点,从webdriver会话复制cookies,然后使用requests.get(url,cookies=webdriver_cookies)获取文件。

这是我解决问题的要点

fp = webdriver.FirefoxProfile() 
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False) 
fp.set_preference("browser.download.dir",'xx/yy') 
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream") 
driver = webdriver.Firefox(fp)

# selenium login code ...

driver_cookies = driver.get_cookies()
cookies_copy = {}
for driver_cookie in driver_cookies:
    cookies_copy[driver_cookie["name"]] = driver_cookie["value"]
r = requests.get('url',cookies = cookies_copy)
print r.text

我希望这能帮助某人

相关问题 更多 >