2013-01-08 9 views
6

मैं पीईक्यूटी मूल्यांकन जावास्क्रिप्ट() (या समान हो सकता है) में एक फ़ंक्शन बनाना चाहता हूं और मूल्यांकन किए गए फ़ंक्शन का नतीजा प्रदर्शित करना चाहता हूं। वास्तविक कार्य बहुत बड़ा होगा, और यह एक स्ट्रिंग नहीं हो सकता है।पाइथन चर में जावास्क्रिप्ट फ़ंक्शन का परिणाम कैसे डालें। पीईक्यूटी

मैं केवल पीईक्यूटी कोड के अंदर एक फ़ंक्शन बनाने और पाइथन चर में परिणाम प्राप्त करने में दिलचस्प हूं।

अधिक स्पष्ट मैं आपको एक उदाहरण देता होगा होने के लिए: है कि js कि मैं http://jquery.com पर loadFinished बाद में लिखना चाहते हैं:

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_() 
+0

एक प्राप्त या पोस्ट पैरामीटर – Ibu

+0

आप दे सकते हैं के रूप में यह पारित करके मुझे एक उदाहरण है? – Vor

+1

उचित JQuery: 'w = $ ('p')। बच्चे()। Eq (0) .html();' –

उत्तर

7

इस उदाहरण में पहले मैं बनाने के एक myWindow जावास्क्रिप्ट वस्तु मुख्य फ्रेम करने के लिए self पास करके, तो evaluateJavaScript फोन जब loadFinished:

#!/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_()) 
+1

बहुत बढ़िया, आप सबसे अच्छे हैं !!! धन्यवाद – Vor

+0

यह वास्तव में एक शानदार जवाब है क्योंकि यह संक्षेप में अभी भी बहुत उपयोगी सामग्री दिखाता है। एक अंग्रेजी विवरण उपयोगी होगा, हालांकि, उन लोगों के लिए जो अभी तक पाइथन, पीईक्यूटी, और जावास्क्रिप्ट में पूरी तरह से धाराप्रवाह नहीं हैं। मैं इसे एक शॉट दूंगा। –

+0

उपयोगी होने पर इनमें से किसी भी का उपयोग कर सकते हैं: यद्यपि एक myWindow ऑब्जेक्ट एक पायथन ऑब्जेक्ट है, लेकिन यह QWebView से प्राप्त होता है और इस प्रकार यह स्वयं को बना देता है क्योंकि वेबपृष्ठ में जावास्क्रिप्ट ऑब्जेक्ट के रूप में स्वयं को (Qt का उपयोग करके) स्वयं को सम्मिलित कर सकता है। यह दो कॉलबैक में भी गुजरता है: 1) on_loadFinished() विधि ताकि पेज लोड होने के बाद यह प्रसंस्करण जारी रहे; 2) एक शो मैसेज() विधि जो वेबपृष्ठ का अपना जावास्क्रिप्ट कोड कॉल कर सकता है। एक बार पृष्ठ लोड हो जाने पर ट्रिगर ऑन_लोडफिशिश(), जो वेबपृष्ठ को कुछ जावास्क्रिप्ट (getJsValue) चलाने के लिए देता है, और वह कोड बदले में पायथन विधि showMessage() को कॉल करता है। पूर्ण गोल। –

संबंधित मुद्दे