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 コードやアプレットの結果を取得する方法です。

4

2 に答える 2

1

の PySide ドキュメントで決定するとQWebFrame.evaluateJavaScript、それは...

このフレームをコンテキストとして使用して scriptSource によって定義された JavaScript を評価し、最後に実行されたステートメントの結果を返します。

JSから何かを返す必要があることは間違いありません。

したがって、そのメソッド呼び出しから抜け出す理由を理解する唯一の方法Noneは、JS 側で「最後に実行されたステートメント」の実際の値を知ることです。(補足として、JS 側null実際にor値を返している可能性がありundefinedます。これは Python に正しくマップさNoneれ、「None」として出力されます。)

最初に、既知のハードコードされた定数値を返す非常に単純な Javascript のスニペットを実行してみて、それがうまくいくかどうかを確認することをお勧めします。問題が解決しない場合は、最初にその非常に単純なスニペットで解決することをお勧めします。それが機能するようになったら、実際の Javascript コードに進みます。

この話の教訓は、ある時点で問題が消えるように段階的に問題を減らすことからデバッグを開始し、次に問題が再び現れる正確な瞬間を見つけ出すことです。それ以外の場合は、見つけたり見たりしていないものと戦っているだけです。

于 2013-11-18T12:27:30.313 に答える
0

QWebFrame.evaluateJavaScript はそれを行いますが、うまく機能しません。常に正しい型を返すとは限らず、関数呼び出しでは常に None を返すことがわかりました。結果を取得する 1 つの方法は、返されたアイテムをアクセスできる変数に設定し、その変数で evaluateJavaScript を再度呼び出すことです。

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

「DukascopyApplet」を見たところ、典型的なデータ型ではありません。文字列、int、float、bool などの標準データ型のみを Python に転送または返すことができます。おそらく「DukascopyApplet」を調べて、必要な特定のデータを見つける必要があります。もう 1 つの方法として、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 に答える