【问题标题】:Trying to download multiple files from the same dropdown menu - Python Selenium Chromedriver尝试从同一个下拉菜单中下载多个文件 - Python Selenium Chromedriver
【发布时间】:2020-09-08 16:33:32
【问题描述】:

我在尝试使用 Selenium Chromedriver 从网站上的同一个下拉菜单中下载两个单独的文件时遇到问题。

我有代码可以点击这两个链接,但它只承认第一个链接;第二个文件没有被下载。我知道当我不使用 webdriver 时,我可以同时进行多个下载,所以问题可能是 chromedriver 一次只允许下载一个?我不知道。我尝试在电子表格和 shapefile 点击之间添加一个隐式等待,但这最终导致代码只下载 shapefile 而不是电子表格。这是我的代码。

from selenium import webdriver

### Assign chrome driver path and setup driver ###
chromedriver = r"C:\Users\johns\Documents\chromedriver"
driver = webdriver.Chrome(chromedriver)

### Open Chrome and go to webpage for file ###
driver.get("http://data-ocpagis.opendata.arcgis.com/datasets/osceolataxparcels09012020?geometry=-82.957%2C27.570%2C-79.562%2C28.419")
### Wait because ARCGISOL webpages take a little to fully load ###
driver.implicitly_wait(5)

### Click Download dropdown button ###
DownloadButton = driver.find_element_by_xpath("""//*[@id="ember64"]/button""")
DownloadButton.click()

### Click link for csv download ###
CSVLink = driver.find_element_by_id("ember66")
CSVLink.click()

### Click link for shapefile download ###
ShapefileLink = driver.find_element_by_id("ember68")
ShapefileLink.click()

使用此代码,单击 CSV 文件按钮并下载文件,但之后没有任何反应。我需要此代码从下拉菜单中单击并下载电子表格和 shapefile。

【问题讨论】:

    标签: python-3.x selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    尝试在下载之间刷新页面:

    driver.refresh();
    

    【讨论】:

    • 成功了,非常感谢!我只需要在第二次下载之前重新插入下拉按钮点击,它就像一个魅力!
    • 一个问题:我必须为 11 个不同的网站编写这个脚本,有些网站我必须从其中下载 10 多个文件。是否需要始终刷新并重新单击我的下拉按钮才能下载多个文件?这似乎比必要的工作要多一些,但我对硒还是很陌生。
    • 好吧,我想这就是您网站的工作方式。也许你可以和你的开发人员谈谈(如果你使用 selenium 来自动化测试——这只是我的假设),他们可以改变你页面的工作方式。
    • 我实际上只是在使用 selenium 从多个不同的县房地产评估网站收集数据,而不是用于任何测试目的。但我确信我能找出使这个过程顺利进行的最佳方法。我已接受并赞成您的回答,再次感谢!
    【解决方案2】:

    另一种方法是使用 BeautifulSoup 等库从 HTML 中提取下载链接。

    访问该网站后,您可以获取页面源并从中创建汤。然后我们可以搜索下载项目并获取 url。

    from bs4 import BeautifulSoup
    from requests import get
    
    req = get('http://data-ocpagis.opendata.arcgis.com/datasets/osceolataxparcels09012020?geometry=-82.957%2C27.570%2C-79.562%2C28.419&selectedAttribute=AREA')
    soup = BeautifulSoup(str(req.content), 'html.parser')
    files = soup.find_all('a', class_='download-item')
    
    for file in files:
        print(file['href'])
    

    【讨论】:

    • 我以前没用过漂亮的汤,但它确实看起来很有用。我知道 selenium 的正常意图是网页测试,但我只是用它从我需要的网站上抓取不同的文件。你会推荐使用 Beautiful Soup 而不是 selenium 来达到这个目的吗?
    • @ParkerJohnson 如果你只是在刮,Beautiful Soup 可能很适合你。它不需要为浏览器安装网络驱动程序。
    • 我绝对会推荐beautifulsoup。 Selenium 是一个很棒的工具,但对于较小的工作,仅使用 html 解析器就可以更轻松、更高效地完成抓取。
    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多