Skip to main content
 首页 » 编程设计

python之如何使用 QWebEngineView 和 QUrl 下载 csv 文件

2024年08月13日51shangdawei

我正在构建一个程序,它使用 QWebEngineView 和 QUrl 在我的 PyQt5 应用程序(在 Windows 10 上运行)中显示一个网站。但是,我现在希望能够从同一网站下载 CSV 文件,但作为菜鸟,我似乎无法弄清楚如何去做。

我很熟悉使用requests、urllib.request、urllib3等下载文件,但是为此,我特别想用 QWebEngineView 来做,因为用户之前已经在 pyqt5 窗口中验证了请求。 首先显示网站的代码如下:

self.view = QWebEngineView(self) 
self.view.load(QUrl(url)) 
self.view.loadFinished.connect(self._on_load_finished) 
self.hbox.addWidget(self.view) 

有人对如何实现这一目标有任何建议吗?

请您参考如下方法:

默认情况下,在 QWebEngineView 中不处理下载,要启用它,您必须使用 QWebEngineProfile 的 downloadRequested 信号,这会传输一个 QWebEngineDownloadItem,如果您希望开始下载,则必须接受该信号:

from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets 
 
 
class Widget(QtWidgets.QWidget): 
    def __init__(self, parent=None): 
        super(Widget, self).__init__(parent) 
 
        self.view = QtWebEngineWidgets.QWebEngineView() 
        self.view.page().profile().downloadRequested.connect( 
            self.on_downloadRequested 
        ) 
        url = "https://domain/your.csv" 
        self.view.load(QtCore.QUrl(url)) 
        hbox = QtWidgets.QHBoxLayout(self) 
        hbox.addWidget(self.view) 
 
    @QtCore.pyqtSlot("QWebEngineDownloadItem*") 
    def on_downloadRequested(self, download): 
        old_path = download.url().path()  # download.path() 
        suffix = QtCore.QFileInfo(old_path).suffix() 
        path, _ = QtWidgets.QFileDialog.getSaveFileName( 
            self, "Save File", old_path, "*." + suffix 
        ) 
        if path: 
            download.setPath(path) 
            download.accept() 
 
 
if __name__ == "__main__": 
    import sys 
 
    app = QtWidgets.QApplication(sys.argv) 
    w = Widget() 
    w.show() 
    sys.exit(app.exec_()) 

如果想直接下载可以使用QWebEnginePage的下载方式:

self.view.page().download(QtCore.QUrl("https://domain/your.csv")) 

更新:

@QtCore.pyqtSlot("QWebEngineDownloadItem*") 
def on_downloadRequested(self, download): 
    old_path = download.url().path()  # download.path() 
    suffix = QtCore.QFileInfo(old_path).suffix() 
    path, _ = QtWidgets.QFileDialog.getSaveFileName( 
        self, "Save File", old_path, "*." + suffix 
    ) 
    if path: 
        download.setPath(path) 
        download.accept() 
        download.finished.connect(self.foo) 
 
def foo(self): 
    print("finished")