Как скачать CSV-файл с помощью QWebEngineView и QUrl - PullRequest
2 голосов
/ 03 мая 2019

Я создаю программу, которая использует 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)

У кого-нибудь есть какие-либо предложения о том, как этого можно достичь?

1 Ответ

3 голосов
/ 03 мая 2019

В QWebEngineView по умолчанию загрузки не обрабатываются, чтобы включить его, вы должны использовать сигнал downloadRequested QWebEngineProfile, который транспортирует QWebEngineDownloadItem, который вы должны принять, если хотите, чтобы загрузка началась:

from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        QtWebEngineWidgets.QWebEngineProfile.defaultProfile().downloadRequested.connect(
            self.on_downloadRequested
        )

        self.view = QtWebEngineWidgets.QWebEngineView()
        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")
...