Python PyQt5 не может правильно загрузить некоторые страницы - PullRequest
0 голосов

Я пытаюсь загрузить страницу в веб-просмотре, чтобы я мог взаимодействовать с ней и затем анализировать некоторые данные. Страница, с которой я хочу взаимодействовать, и анализ должны быть созданы с начальной страницы (https://www.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/ ). Моя проблема даже в том случае, если окно создания откроет страницу, на которой он почти ничего не загрузит.

Ссылка, открывающая страницу, которую я хочу открыть (если вы прокрутите вниз вправо), называется STRUCTURED EDITOR:

enter image description here

Мой сценарий:

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
import time



class MYview(QWebView):

    def __init__(self, parent=None):
        super(MYview, self).__init__(parent)

    def createWindow(self,wintype):
            print("aaaaaaaaaaaaa")
            self.webView = MYview()
            time.sleep(2)
            self.webView.page().settings().globalSettings().setAttribute(QWebSettings.JavascriptCanOpenWindows, True)
            self.webView.page().settings().globalSettings().setAttribute(QWebSettings.PluginsEnabled, True)
            self.webView.page().settings().globalSettings().setAttribute(QWebSettings.JavascriptEnabled, True)
            self.webView.page().settings().globalSettings().setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, True)
            self.webView.page().settings().globalSettings().setAttribute(QWebSettings.LocalContentCanAccessFileUrls, True)
            self.webView.page().settings().globalSettings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
            self.webView.loadFinished.connect(self._on_load_finished)
            return self.webView
    def javaScriptConsoleMessage(self, msg, line, source):
        print ('%s line %d: %s')%(source, line, msg)

    def _on_load_finished(self, ok):
        print(self.webView.url())
        self.webView.loadFinished.disconnect(self._on_load_finished)


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.public.nm.eurocontrol.int/PUBPORTAL/gateway/spec/'))

    def loadUrl(self, url):    
        self.view = MYview()
        self.view.page().settings().globalSettings().setAttribute(QWebSettings.JavascriptCanOpenWindows, True)
        self.view.page().settings().globalSettings().setAttribute(QWebSettings.PluginsEnabled, True)
        self.view.page().settings().globalSettings().setAttribute(QWebSettings.JavascriptEnabled, True)
        self.view.page().settings().globalSettings().setAttribute(QWebSettings.LocalContentCanAccessRemoteUrls, True)
        self.view.page().settings().globalSettings().setAttribute(QWebSettings.LocalContentCanAccessFileUrls, True)
        self.view.page().settings().globalSettings().setAttribute(QWebSettings.DeveloperExtrasEnabled, True)
        self.view.loadFinished.connect(self._on_load_finished)
        self.view.linkClicked.connect(self.on_linkClicked)
        # 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):
        self.view.loadFinished.disconnect(self._on_load_finished)
        index = self.tabWidget.indexOf(self.sender())
        self.tabWidget.setTabText(index, self.sender().url().host())
        self.view.page().mainFrame().evaluateJavaScript("document.getElementsByTagName('button')[0].click();")



    def on_linkClicked(self, url):
        print('link clicked to {}'.format(url))    
        self.loadUrl(url)


    def javaScriptConsoleMessage(self, msg, line, source):
        print ('%s line %d: %s')%(source, line, msg)



def main():
    app = QtWidgets.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

Некоторые страницы, которые еще открыты, открываются просто отлично, но все страницы необходимо перенести с основного сайта, не делайте Может быть, это как-то связано с маршрутизацией, но я не могу понять это

1 Ответ

1 голос
/ 15 марта 2020

Проблема в том, что новое окно создается с помощью сетевого запроса POST, и вам нужно наследовать его от страницы, которая его создает.

Обратите внимание, что вы должны отслеживать существующие windows и удалите их при закрытии, иначе, если существующая страница пытается загрузить в цель, которая все еще существует (даже если вы закрыли окно), новая страница не будет открыта.

class MYview(QWebView):
    views = []

    def __init__(self, parent=None):
        super(MYview, self).__init__(parent)
        self.views.append(self)

    def createWindow(self,wintype):
        webView = MYview()
        webView.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        webView.destroyed.connect(lambda w, view=webView: self.views.remove(view))
        <b>webView.page().setNetworkAccessManager(self.page().networkAccessManager())</b>
        return webView

Я также удалил настройки, так как вы уже сделали это для глобальных настроек в главном окне, нет необходимости устанавливать их снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...