Python PyQt5 webview 无法打开没有 url 创建的标签页
Python PyQt5 webview can't open tabs created with no url
尝试解析具有 pyqt5.My 问题的网站时,此页面创建的选项卡不是 link,而是创建具有 onclick 功能的选项卡的按钮,因此当我使用linkClicked signal nothing happens.The generated tab is the one I want to parse.
我在网上找到的所有示例都会打开带有 link 的选项卡,所以我无法理解这个。
P.S。我知道 Qwebkit 是 predicated 但我必须使用它才能 windows xp 兼容。
我有:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWebKitWidgets import QWebView , QWebPage
from PyQt5 import QtWebKit
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtNetwork import *
import sys
class MainForm(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
self.tabWidget = QtWidgets.QTabWidget(self)
self.setCentralWidget(self.tabWidget)
self.loadUrl(QtCore.QUrl('https://www.notams.faa.gov/dinsQueryWeb/'))
def loadUrl(self, url):
self.view = QWebView()
self.view.loadFinished.connect(self._on_load_finished)
self.view.linkClicked.connect(self.on_linkClicked)
self.view.loadStarted.connect(self.on_url_changed)
self.view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
self.tabWidget.setCurrentIndex(self.tabWidget.addTab(self.view, 'loading...'))
self.view.load(url)
def _on_load_finished(self, ok):
index = self.tabWidget.indexOf(self.sender())
self.tabWidget.setTabText(index, self.sender().url().host())
self.view.page().mainFrame().evaluateJavaScript("document.getElementsByTagName('button')[0].click();")
self.view.page().mainFrame().evaluateJavaScript("document.getElementsByName('retrieveLocId')[0].value='%s';"%('lgel lgal lggg'))
self.view.page().mainFrame().evaluateJavaScript("document.getElementsByName('submit')[0].click();")
def on_linkClicked(self, url):
self.loadUrl(url)
def on_url_changed(self):
print('xdddd')
def main():
app = QtWidgets.QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()
if __name__ == '__main__':
main()
当一个页面请求创建一个新的window时,createWindow(WebWindowType)
被调用;如果该方法没有return一个新的QWeb[Engine]View(或者没有实现,默认)在视图上调用类似的方法;再一次,如果它没有实现,什么也不会发生。
如果你想加载新的 window 在同一个请求中,只需重写 WebView 和 return self
,并启用打开新 [=] 的支持22=] 来自 javascript:
class SelfishWebView(QWebView):
def createWindow(self, windowType):
return self
class MainForm(QtWidgets.QMainWindow):
# ...
def loadUrl(self, url):
self.view = SelfishWebView()
self.view.page().settings().setAttribute(
QWebSettings.JavascriptCanOpenWindows, True)
# ...
请注意,如果您像那样执行 javascript,它会在新页面加载后立即尝试再次递归调用(并且,由于该新页面中有一个按钮,它会尝试单击它);第一次加载时请立即断开信号
def _on_load_finished(self, ok):
self.view.loadFinished.disconnect(self._on_load_finished)
# ...
尝试解析具有 pyqt5.My 问题的网站时,此页面创建的选项卡不是 link,而是创建具有 onclick 功能的选项卡的按钮,因此当我使用linkClicked signal nothing happens.The generated tab is the one I want to parse.
我在网上找到的所有示例都会打开带有 link 的选项卡,所以我无法理解这个。
P.S。我知道 Qwebkit 是 predicated 但我必须使用它才能 windows xp 兼容。
我有:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QUrl
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWebKitWidgets import QWebView , QWebPage
from PyQt5 import QtWebKit
from PyQt5.QtWebKit import QWebSettings
from PyQt5.QtNetwork import *
import sys
class MainForm(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainForm, self).__init__(parent)
self.tabWidget = QtWidgets.QTabWidget(self)
self.setCentralWidget(self.tabWidget)
self.loadUrl(QtCore.QUrl('https://www.notams.faa.gov/dinsQueryWeb/'))
def loadUrl(self, url):
self.view = QWebView()
self.view.loadFinished.connect(self._on_load_finished)
self.view.linkClicked.connect(self.on_linkClicked)
self.view.loadStarted.connect(self.on_url_changed)
self.view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
self.tabWidget.setCurrentIndex(self.tabWidget.addTab(self.view, 'loading...'))
self.view.load(url)
def _on_load_finished(self, ok):
index = self.tabWidget.indexOf(self.sender())
self.tabWidget.setTabText(index, self.sender().url().host())
self.view.page().mainFrame().evaluateJavaScript("document.getElementsByTagName('button')[0].click();")
self.view.page().mainFrame().evaluateJavaScript("document.getElementsByName('retrieveLocId')[0].value='%s';"%('lgel lgal lggg'))
self.view.page().mainFrame().evaluateJavaScript("document.getElementsByName('submit')[0].click();")
def on_linkClicked(self, url):
self.loadUrl(url)
def on_url_changed(self):
print('xdddd')
def main():
app = QtWidgets.QApplication(sys.argv)
form = MainForm()
form.show()
app.exec_()
if __name__ == '__main__':
main()
当一个页面请求创建一个新的window时,createWindow(WebWindowType)
被调用;如果该方法没有return一个新的QWeb[Engine]View(或者没有实现,默认)在视图上调用类似的方法;再一次,如果它没有实现,什么也不会发生。
如果你想加载新的 window 在同一个请求中,只需重写 WebView 和 return self
,并启用打开新 [=] 的支持22=] 来自 javascript:
class SelfishWebView(QWebView):
def createWindow(self, windowType):
return self
class MainForm(QtWidgets.QMainWindow):
# ...
def loadUrl(self, url):
self.view = SelfishWebView()
self.view.page().settings().setAttribute(
QWebSettings.JavascriptCanOpenWindows, True)
# ...
请注意,如果您像那样执行 javascript,它会在新页面加载后立即尝试再次递归调用(并且,由于该新页面中有一个按钮,它会尝试单击它);第一次加载时请立即断开信号
def _on_load_finished(self, ok):
self.view.loadFinished.disconnect(self._on_load_finished)
# ...