2017-12-08 11 views
0

すべてのDOM要素の境界ボックスの座標を取得しようとしています。私は現在、pyqt5を使用していますが、以下のコードで正常にそれを行うことができます:このコードのpyqt5でビューを表示せずにDOM要素の座標を取得する

class Browser(QWebEngineView): 
    def __init__(self): 
     super(Browser, self).__init__() 
     self.loadFinished.connect(self._load_finished) 

    def _result(self, x): 
     for tagname, top, right, bottom, left in x: 
      print "%8s %3d %3d %3d %3d"%(tagname, top, right, bottom, left) 

    def _load_finished(self): 
     js_script = """ 
       function get_coordinates() { 
        var res = []; 
        var all = document.getElementsByTagName("*"); 
        for (var i=0, max=all.length; i < max; i++) { 
         var rect = all[i].getBoundingClientRect() 
         res.push([all[i].tagName, rect.top, rect.right, rect.bottom, rect.left]); 
        } 
        return res;    
       } 
       get_coordinates(); 
       """ 
     self.page().runJavaScript(js_script, self._result) 

app = QApplication(sys.argv) 
br = Browser() 
url = QUrl(url_address) 
br.load(url) 
br.show() 
app.exec_() 

一つの欠点は、それが(理由br.show()の)Webページを表示するには、ブラウザを開くことで、私はこれを防ぐ方法があれば疑問に思う。私は単にbr.show()にコメントし、コードを実行しました。しかし、いくつかのDOM要素の座標結果は元のものとは異なります。

おかげで、

答えて

1

あなたがQWebEnginePageを使用するウィンドウを表示しないようにしたい場合は、次の答えを

class Browser(QWebEnginePage): 
    def __init__(self): 
     super(Browser, self).__init__() 
     self.loadFinished.connect(self._load_finished) 

    def _result(self, x): 
     for tagname, top, right, bottom, left in x: 
      print("%8s %3d %3d %3d %3d"%(tagname, top, right, bottom, left)) 

    def _load_finished(self): 
     js_script = """ 
       function get_coordinates() { 
        var res = []; 
        var all = document.getElementsByTagName("*"); 
        for (var i=0, max=all.length; i < max; i++) { 
         var rect = all[i].getBoundingClientRect() 
         res.push([all[i].tagName, rect.top, rect.right, rect.bottom, rect.left]); 
        } 
        return res;    
       } 
       get_coordinates(); 
       """ 
     self.runJavaScript(js_script, self._result) 

app = QApplication(sys.argv) 
br = Browser() 
url = QUrl(url_address) 
br.load(url) 
app.exec_() 
+0

感謝。変更されたコードは1つのことを除いて正常に動作します。いくつかのDOM要素について、私は異なる座標を取得します - rect.top、rect.bottom、およびrect.leftは同じですが、rect.rightだけが異なります。私は理由を理解しようとしていますが、これまで運がありませんでした。 – DSKim

+0

あなたはどんな尺度を使って比較していますか? – eyllanesc

+0

私はちょうどgetBoundingClientRectを使用して座標を取得するjavascriptの戻り値を比較しました。私はコードを非常に単純なhtmlでテストしました。

テスト

です。 WebEngineViewでは、h1の境界ボックスは{left:8、right:792、top:8、bottom:45}です。 WebEnginePageでは、h1の境界ボックスは{left:8、right:8、top:8、bottom:45}です。 – DSKim

関連する問題