如何将 JavaScript 函数的结果放入 python 变量中。 PyQt

Posted

技术标签:

【中文标题】如何将 JavaScript 函数的结果放入 python 变量中。 PyQt【英文标题】:How to put result of JavaScript function into python variable. PyQt 【发布时间】:2013-01-08 04:22:18 【问题描述】:

我想在 PyQt evaluatejavascript() 中创建一个函数(或者可能是类似的),然后显示评估函数的结果。 真正的函数会大很多,而且可能不是字符串。

我只对如何在 PyQt 代码中创建函数并将结果放入 python 变量感兴趣。

为了更清楚,我举个例子: 这就是我想在loadFinishedhttp://jquery.com之后输入的js:

w = document.getElementsByTagName('p')[0];
w.innerhtml

如果我在浏览器控制台中执行此操作,我将得到一个输出:

"jQuery is a fast and concise JavaScript Library ...... blah blah blah"

我想将此输出存储在一个变量中。

#!/usr/bin/env python

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
import os, sys, signal
from urllib2 import urlopen

class GBot(QWebView):

    def __init__(self):
        QWebView.__init__(self)
        self.setPage(BrowserSettings())
        #self.jquery = get_jquery()
        self.load(QUrl('http://jquery.com'))
        self.frame = self.page().currentFrame()

    def _loadFinished(self, ok):
        doc = self.frame.documentElement()
        #doc.evaluateJavaScript(self.jquery)
        r = doc.evaluateJavaScript('''w = document.getElementsByTagName('p')[0]; w.innerHTML''')
        print r #want to do something like this


if __name__ == '__main__':
    app = QApplication(sys.argv)
    bot = GBot()
    bot.show()
    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_()

【问题讨论】:

通过将其作为 get 或 post 参数传递 你能举个例子吗? 正确的 JQuery:w = $('p').children().eq(0).html(); 【参考方案1】:

在这个例子中,我首先通过将self 传递给主框架来创建一个myWindow javascript 对象,然后在loadFinished 时调用evaluateJavaScript

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui, QtWebKit  

getJsValue = """ 
w = document.getElementsByTagName('p')[0];
myWindow.showMessage(w.innerHTML);
"""  

class myWindow(QtWebKit.QWebView):  
    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.page().mainFrame().addToJavaScriptWindowObject("myWindow", self)

        self.loadFinished.connect(self.on_loadFinished)

        self.load(QtCore.QUrl('http://jquery.com'))

    @QtCore.pyqtSlot(str)  
    def showMessage(self, message):
        print "Message from website:", message

    @QtCore.pyqtSlot()
    def on_loadFinished(self):
        self.page().mainFrame().evaluateJavaScript(getJsValue) 

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myWindow')

    main = myWindow()
    main.show()

    sys.exit(app.exec_())

【讨论】:

这确实是一个很棒的答案,因为它简洁但说明了很多有用的东西。不过,对于那些还没有完全流利使用 Python、PyQt 和 JavaScript 的人来说,英文描述会很有帮助。我试试看。 如果有用的话,可以使用其中的任何一个:虽然 myWindow 对象是 Python 对象,但它继承自 QWebView,因此当它自己构造时,可以将自己(使用 Qt)作为 JavaScript 对象插入到网页中。它还传入两个回调: 1) on_loadFinished() 方法,以便在页面加载后继续处理; 2) 网页自带的JavaScript代码可以调用的showMessage()方法。一旦页面加载完毕,就会触发 on_loadFinished(),这会为网页提供一些 JavaScript (getJsValue) 以运行,然后该代码会调用 Python 方法 showMessage()。整圈。

以上是关于如何将 JavaScript 函数的结果放入 python 变量中。 PyQt的主要内容,如果未能解决你的问题,请参考以下文章

由于某种原因,值状态未定义,我如何将 javascript 结果放入网页中[重复]

我如何将case语句放入javascript中的循环中

如何将 discord.py 帮助命令放入嵌入中?

如何将对象属性作为参数传递? (JavaScript)

python中如何统计字符串中各个字母的个数

将函数放入 javascript 对象中是一种好习惯吗? [复制]