【发布时间】:2015-02-20 17:18:58
【问题描述】:
我正在尝试使用 PySide 的 QtWebKit 模块加载网页。根据文档 (Elements of QWebView; QWebFrame::toHtml()),以下脚本应打印 Google 搜索页面的 HTML:
from PySide import QtCore
from PySide import QtGui
from PySide import QtWebKit
# Needed if we want to display the webpage in a widget.
app = QtGui.QApplication([])
view = QtWebKit.QWebView(None)
view.setUrl(QtCore.QUrl("http://www.google.com/"))
frame = view.page().mainFrame()
print(frame.toHtml())
但可惜不是。打印出来的只是方法等效的空响应:
<html><head></head><body></body></html>
于是我仔细查看了setUrl documentation:
视图保持不变,直到有足够的数据来显示新的 url。
这让我觉得可能是我在收到来自服务器的响应之前太早调用了 toHtml() 方法。于是我写了一个覆盖setUrl方法的类,一直阻塞直到触发了loadFinished信号:
import time
class View(QtWebKit.QWebView):
def __init__(self, *args, **kwargs):
super(View, self).__init__(*args, **kwargs)
self.completed = True
self.loadFinished.connect(self.setCompleted)
def setCompleted(self):
self.completed = True
def setUrl(self, url):
self.completed = False
super(View, self).setUrl(url)
while not self.completed:
time.sleep(0.2)
view = View(None)
view.setUrl(QtCore.QUrl("http://www.google.com/"))
frame = view.page().mainFrame()
print(frame.toHtml())
这根本没有区别。我在这里错过了什么?
编辑:仅仅获取页面的 HTML 并不是我的最终目标。这是一个简化的代码示例,它没有按我预期的方式工作。感谢 Oleh 建议用 app.processEvents() 替换 time.sleep()
【问题讨论】:
标签: python qt pyqt pyside qwebview