【问题标题】:How to get html of a page loaded in QWebEngineView如何获取在 QWebEngineView 中加载的页面的 html
【发布时间】:2020-01-08 19:37:33
【问题描述】:

我正在尝试获取在 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_())

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

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

【问题讨论】:

  • 替代方案?可能使用 PySide2。您的代码只需更改导入即可开箱即用
  • @Pa_ 你能分享一个例子的链接吗?
  • @Pa_PySide2 不是一个选项,例如它没有实现很多功能,恕我直言 PyQt5 的错误比 PySide2 少

标签: python python-3.x pyqt pyqt5 qwebengineview


【解决方案1】:

使用我的old answer 编写的 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_())

更新:

您的问题是 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_())

【讨论】:

  • 有没有办法不用回调函数但访问原始html?
猜你喜欢
  • 2017-10-29
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
相关资源
最近更新 更多