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()