如何获取在 QWebEngineView 中加载的页面的 html

Vil*_*nen 3 python pyqt python-3.x pyqt5 qwebengineview

我正在尝试获取在 PyQT5 QWebEngineView 中加载的页面的 HTML。这是一个简单的例子:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import *


def callback_function(html):
    print(html)


def on_load_finished():

    web.page().runJavaScript("document.getElementsByTagName('html')[0]", callback_function)


app = QApplication(sys.argv)
web = QWebEngineView()
web.load(QUrl("https://stackoverflow.com"))
web.show()
web.loadFinished.connect(on_load_finished)

sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

我希望能够从 runJavaScript() 调用返回 html,但我在回调函数中得到一个空白。

我的代码中有什么不正确的地方以及哪些替代方法可用于获取页面的 HTML?

eyl*_*esc 5

使用我写的 C++ 的旧答案并将解决方案翻译成 Python:

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QApplication


def callback_function(html):
    print(html)


def on_load_finished():
    web.page().runJavaScript("document.documentElement.outerHTML", callback_function)


app = QApplication(sys.argv)
web = QWebEngineView()
web.load(QUrl("https://stackoverflow.com"))
web.show()
web.resize(640, 480)
web.loadFinished.connect(on_load_finished)

sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

更新:

您的情况的问题是 getElementsByTagName() 返回一个js元素列表,并且该元素无法导出到python,您应该做的是获取innerHTML:

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QApplication


def callback_function(html):
    print(html)


def on_load_finished():
    web.page().runJavaScript(
        "document.getElementsByTagName('html')[0].innerHTML", callback_function
    )
    # or document.getElementsByTagName('html')[0].outerHTML


app = QApplication(sys.argv)
web = QWebEngineView()
web.load(QUrl("https://stackoverflow.com"))
web.show()
web.resize(640, 480)
web.loadFinished.connect(on_load_finished)

sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)