ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript-使用PyQt获取动态内容

2019-11-11 20:35:20  阅读:536  来源: 互联网

标签:pyqt5 pyqt pyqt4 javascript jquery


我需要获取一个动态内容,该内容由ajax js调用加载.

我真的不知道如何使用PyQt,但我希望可以做到这一点. HTML类似于:

<a href="#" id="id" onclick="A4J.AJAX.Submit('j_id0:j_id1:j_id110',event,{'similarityGroupingId':'j_id0:j_id1:j_id110:j_id582:0:j_id584'});return false;">NETHERLANDS</a>`

我可以使用以下简单代码使用PyQt渲染页面:

def render(source_html):

    import sys
    from PyQt5.QtCore import QEventLoop
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtWebEngineWidgets import QWebEngineView

    class Render(QWebEngineView):
        def __init__(self, html):
            self.html = None
            self.app = QApplication(sys.argv)
            QWebEngineView.__init__(self)
            self.loadFinished.connect(self._loadFinished)
            self.setHtml(html)

            while self.html is None:
                self.app.processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents)
            self.app.quit()

        def _callable(self, data):
            self.html = data

        def _loadFinished(self, result):
            self.page().toHtml(self._callable)

    return Render(source_html).html

import requests
sample_html = requests.get('https://riverbankcomputing.com/software/pyqt/').text
print(render(sample_html))

如何运行“ onclick”并获取内容?

解决方法:

这是一个老问题,但是…

要从javascript运行PyQt函数:

尽管可能有很多方法可以实现,但是我已经通过使用QWebChannel解决了它,然后从您的html调用js函数,然后使用Web通道与Qt进行通信.

您将需要qwebchannel.js.我是从本地计算机上的Qt5示例目录获得的.网路上的许多地方都有相同的档案.我让你找它.

此方法的大部分描述如下:http://doc.qt.io/qt-5/qtwebchannel-javascript.html

在您的__init__中,创建一个网络频道:

self.webchannel = QtWebChannel.QWebChannel(self)

然后将您的webengineview的主页设置为使用该频道,并注册要在PyQt和js之间共享的对象:

self.page().setWebChannel(self.webchannel)
self.webchannel.registerObject('MyChannel', self)

在您的.js(或.html的javascript部分)中,设置网络渠道:

var MyChannel = null;
new QWebChannel(qt.webChannelTransport, function(channel) {
                MyChannel = channel.objects.MyChannel;
});

(这是qwebchannel.js发挥作用的地方.您的js或html文件必须能够包含它.对我来说,在执行任何操作之前,我已加载< script src =“ scripts / qwebchannel.js”>< / script>其他js

现在,您已设置为通过通道从js调用PyQt,但是您可以调用什么呢?任何装饰为PyQt插槽的东西.因此,例如,如果您想在javascript中调用Render中的“ foo”函数,该函数将字符串作为参数,则可以这样创建它(作为Render的成员):

@QtCore.pyqtSlot(str)
def foo(self, some_tring):
    print ("Some string: %s" % some_string)

…然后在js文件中(或在index.html中),只需调用MyChannel.foo(‘whatever’).您可以将其作为onclick进行,也可以从onclick调用的另一个函数的主体中进行.

通过MyChannel.foo(‘whatever’)进行交谈:之所以调用MyChannel,是因为这是分配给在通道中注册的对象的名称(在python中),也是在创建新QWebChannel时在js中使用的名称.创建注册时,您将self作为要注册的对象传递-因此,由MyChannel标识的通道是您的Render对象.您只能通过通道发出信号,因此您“呼叫”的任何内容都必须是插槽-因此是装饰器.

另外,如果您想从PyQt调用js函数,则要容易一些.在这种情况下,您只需致电

self.page().runJavaScript('someJsFunction("whatever");')

如果您需要对响应做出某种处理,因为它被称为异步,则需要设置响应处理程序:

self.page().runJavaScript('someJsFunction("whatever");', self.__callback)

…然后定义回调(可能是Render的成员):

def __callback(self, response):
    if response:
        print ("Handling JS response: %s", response)

标签:pyqt5,pyqt,pyqt4,javascript,jquery
来源: https://codeday.me/bug/20191111/2022357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有