0

想从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代码和/或applet的结果?

4

2 回答 2

1

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

使用此帧作为上下文评估由 scriptSource 定义的 JavaScript,并返回最后执行的语句的结果。

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

因此,了解为什么要None退出该方法调用的唯一方法是了解 JS 端“最后执行的语句”的实际值是多少。(附带说明一下,JS 端可能实际上返回了一个nullorundefined值,它会正确映射到 Python asNone并打印为“None”。)

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

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

于 2013-11-18T12:27:30.313 回答
0

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

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

我只是看了“DukascopyApplet”,它不是典型的数据类型。只有字符串、整数、浮点数、布尔值等标准数据类型可以传输或返回给 python。您可能必须通过“DukascopyApplet”找到您想要的特定数据。另一件可能有帮助的事情是将 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())

查看 DukascopyApplet 后,看起来那里没有任何有用的存储信息。找到这些数据可能很困难。

于 2013-11-20T15:29:30.790 回答