皮赛德.JavaScript.以纯文本或 html 的形式执行 js 和 get 结果

PySide. JavaScript. Execute js an get result as a pure text or html

本文关键字:执行 js 结果 get html JavaScript 文本      更新时间:2023-09-26

想从页面获取日历数据,例如 http://www.dukascopy.com/swiss/english/marketwatch/calendars/eccalendar/数据是动态的,并使用js-applet加载 - "DukascopyApplet"我尝试以这种方式提取数据:

app = QApplication(sys.argv)
web = QWebView()
web.page().mainFrame().loadFinished.connect(print_content)
web.load(QUrl("http://www.dukascopy.com/swiss/english/marketwatch/calendars/eccalendar/"))
web.show()
frame = web.page().mainFrame() 
print(frame.evaluateJavaScript("DukascopyApplet"))
sys.exit(app.exec_())

但它显示"没有"。我正在使用win7,Py3.3,pyside。

所以问题是如何获取加载页面上存在的 js 代码和/或小程序的结果?

由 PySide 文档决定 QWebFrame.evaluateJavaScript ,它...

使用此

帧作为上下文计算 scriptSource 定义的 JavaScript,并返回上次执行的语句的结果。

Se 绝对应该从 JS 返回一些东西。

因此,了解为什么从该方法调用中获得None的唯一方法是知道 JS 端"最后执行的语句"的实际值是多少。(作为旁注,JS端实际上可能返回了一个nullundefined值,该值将正确映射到Python,None并打印为"None"。

我建议你首先尝试执行一个非常简单的Javascript片段,它返回一个你已知的常量硬编码值,看看它是否有效。如果问题仍然存在,我首先建议在那个非常简单的片段上解决它,并且只有在它起作用时,才继续使用真正的 Javascript 代码。

这个故事的教训是,调试应该从逐步减少问题开始,以便在某个时候问题消失,然后找出它再次出现的确切时刻。否则,你只是在与你甚至没有发现/看到的东西作斗争。

QWebFrame.evaluateJavaScript 可以做到这一点,但它的效果并不好。它并不总是返回正确的类型,我发现它在函数调用时总是返回 None。获取结果的一种方法是将返回的项设置为您有权访问的变量,然后对该变量再次调用 evaluateJavaScript。

frame.evaluateJavaScript("myVariable = getResult()")
result = frame.evaluateJavaScript("myVariable")

我刚刚看了"DukascopyApplet",它不是一个典型的数据类型。只有标准数据类型,如字符串、整数、浮点数、布尔值......可以转移或返回给 Python。您可能需要通过"杜高斯贝Applet"并找到所需的特定数据。另一件可能有帮助的事情是将 Python 对象附加到 JavaScript。然后,您可以在JavaScript中调用该python对象的插槽方法。

class MyCLass(object):
    @QtCore.Slot(str)
    def doSomething(self, info):
        # do something with the string info here
frame.addToJavaScriptWindowObject("varName", MyClass)
frame.evaluateJavaScript("varName.doSomething(DukascopyApplet.params.height)")
web.settings().setAttribute(QtWebKit.QWebSettings.WebAttribute.DeveloperExtrasEn‌​abled, True)
inspector = QtWebKit.QWebInspector()
inspector.setPage(web.page())

在浏览了杜高斯贝Applet之后,看起来那里没有任何有用的存储信息。查找数据可能很困难。