如何用Python控制网页对话框

0 投票
3 回答
2945 浏览
提问于 2025-04-15 13:22

我在用Python自动从某个网页下载文件时,遇到了一个网页对话框(我用的是IE浏览器)。这个对话框里有两个按钮,一个是“继续”,另一个是“取消”。我不知道怎么点击“继续”按钮。问题是,我不知道怎么用Python来控制这个网页对话框。我试过用winGuiAuto来找到这个窗口的控件,但它无法识别任何按钮类型的控件……有没有什么建议?

萨莎

我想澄清一下我的问题:

我的目的是从某个网站下载股票数据。我需要为很多股票执行这个操作,所以我希望Python能帮我重复这个过程。这个特定的网站通过让我点击一个链接来导出数据,下载一个Excel文件。然而,点击链接后,我会看到一个网页对话框,问我是否确定要下载这个文件。这个网页对话框就是我的问题所在——它不是一个普通的HTML页面,也不是一个常规的Windows对话框。它是另一种东西,我无法用Python来控制它。这个对话框有两个按钮,我需要点击其中一个(也就是“继续”)。看起来它是IE里实现的一种特殊窗口。它的标题是这样的:网页对话框——下载 blalblabla。如果我手动点击“继续”,它会打开一个普通的Windows对话框(打开、保存、取消),我知道怎么用winGuiAuto库来处理这个对话框。我尝试用这个库来处理网页对话框,但没有成功。我还试过用Autoit Info工具来识别按钮,但也没有成功。实际上,也许这些不是按钮,而是链接,但我看不到链接,也没有源代码可见……我需要的是有人告诉我这个网页对话框是什么,以及怎么用Python来控制它。这就是我的问题。

3 个回答

0

使用 Selenium 的 Python 绑定会更好:

from selenium import webdriver
from selenium.webdriver.common import alert
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
class AlertsManager:
    def alertsManager(self,url):
        self.url_to_visit=url
        self.driver=webdriver.Ie()
        self.driver.get(self.url_to_visit)
        try:
            while WebDriverWait(self.driver,1).until(EC.alert_is_present()):
                self.alert=self.driver.switch_to_alert()
                self.driver.switch_to_alert().accept()
        except TimeoutException:
            pass


if __name__=='__main__':
    AM=AlertsManager()
    url="http://htmlite.com/JS006.php" # This website has 2 popups
    AM.alertsManager(url)
0

标题“网页对话框”说明这是一个由Javascript生成的输入框,所以你无法通过winGuiAuto来访问它。你直接问的问题可能是无法实现的。

不过,如果假设你想做的只是从网站上下载这些数据,那你为什么还要使用图形界面呢?Python提供了你需要的一切,可以直接从互联网下载文件,而不需要控制IE浏览器。你可以按照以下步骤进行:

  1. 下载主页面
  2. 在页面中找到你的下载链接(如果它会变化的话)
  3. 从那个链接下载文件到本地

在Python中,这个过程大概是这样的:

import urllib,re

f = urllib.urlopen('http://yoursitehere') # Original page where the download button is
html = f.read()
f.close()

m = re.search('/[\'"](.*\.xls)["\']/', html, re.S) # Find file ending .xls in page
if m:
    urllib.urlretrieve(m.group(1), 'local_filename.xls') # Retrieve the Excel file
0

你做不到,而且其实也不想这样做。当你提问的时候,试着解释一下你想要达到的目标,而不仅仅是眼前的任务。你可能走错了方向。其实还有其他方法可以实现你想做的事情。

撰写回答