I have Enabled downloads in pyqtwebengineview and it works well. However,I have some problems with the site:”https://www.remove.bg”
So I downloaded The html content of that site and the problem is an anchor tag.
<a href="https://o.remove.bg/downloads/df97f73e-975d-4ff6-9558-d0ad4b486f79/back-removebg-preview.png"target="_blank" rel="noopener" ondragstart="return false;" class="btn btn-primary" style="min-width: 190px;">Download</a>
If I simply remove this target atrribute,It works well.
This works
<a href="https://o.remove.bg/downloads/df97f73e-975d-4ff6-9558-d0ad4b486f79/back-removebg-preview.png"rel="noopener" ondragstart="return false;" class="btn btn-primary" style="min-width: 190px;">Download</a>
difference is just target atrribute.What to do. How to make this site work correctly.
Advertisement
Answer
The redirection link has an attribute of “_blank” that according to the protocol must open a new tab so in a previous answer I explained what the implementation should be, I will omit that part and will only show the code where I remove the new tab when the download is finished.
import sys
from functools import cached_property
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class WebView(QtWebEngineWidgets.QWebEngineView):
    def createWindow(self, type_):
        if not isinstance(self.window(), Browser):
            return
        if type_ == QtWebEngineWidgets.QWebEnginePage.WebBrowserTab:
            return self.window().tab_widget.create_tab()
class TabWidget(QtWidgets.QTabWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setTabsClosable(True)
    def create_tab(self):
        view = WebView()
        index = self.addTab(view, "(Untitled)")
        self.setTabIcon(index, view.icon())
        view.titleChanged.connect(self.update_title)
        view.iconChanged.connect(self.update_icon)
        self.setCurrentWidget(view)
        return view
    def update_title(self, title):
        view = self.sender()
        index = self.indexOf(view)
        self.setTabText(index, title)
    def update_icon(self, icon):
        view = self.sender()
        index = self.indexOf(view)
        self.setTabIcon(index, icon)
class Browser(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        QtWebEngineWidgets.QWebEngineProfile.defaultProfile().downloadRequested.connect(
            self.on_downloadRequested, QtCore.Qt.UniqueConnection
        )
        self.setCentralWidget(self.tab_widget)
        view = self.tab_widget.create_tab()
        view.load(QtCore.QUrl("https://www.remove.bg"))
    @cached_property
    def tab_widget(self):
        return TabWidget()
    def on_downloadRequested(self, download):
        download.finished.connect(self.download_finished)
        default_path = download.downloadFileName()
        suffix = QtCore.QFileInfo(default_path).suffix()
        path, _ = QtWidgets.QFileDialog.getSaveFileName(
            self, "Save File", default_path, "*." + suffix
        )
        if path:
            download.setPath(path)
            download.accept()
    def download_finished(self):
        self.tab_widget.removeTab(self.tab_widget.currentIndex())
def main():
    app = QtWidgets.QApplication(sys.argv)
    w = Browser()
    w.show()
    sys.exit(app.exec_())
if __name__ == "__main__":
    main()
