我使用了下面的代码来拍摄网页的屏幕截图。从代码中我了解到,首先在框架中加载完整的页面,然后以画家的方式呈现框架。我面临的问题是,有些网页的内容可能非常长,但我只想要屏幕截图的第一页的网站。有什么办法可以让我处理吗?
def capture(self, url, output_file):
self.load(QUrl(url))
self.wait_load()
# set to webpage size
frame = self.page().mainFrame()
self.page().setViewportSize(frame.contentsSize())
# render image
image = QImage(self.page().viewportSize(), QImage.Format_ARGB32)
painter = QPainter(image)
frame.render(painter)
painter.end()
print 'saving', output_file
image.save(output_file)我尝试过在QSize对象的帮助下设置框架的首选大小,但也没有帮助。或者说,我有什么办法可以裁剪图像吗?任何帮助都是非常感谢的,谢谢。
发布于 2013-11-17 21:18:27
没有“第一页”这样的东西。如何划分内容完全取决于应用程序。
目前,您的脚本显式地将第一部分设置为页面的整个内容。为了避免这种情况,您应该简单地决定要捕获多少内容,然后根据需要调整viewport的大小。
下面的演示脚本使用QPrinter计算A4页面大小:
usage: capture.py url > webpage.pngfrom PyQt4 import QtCore, QtGui, QtWebKit
class WebPage(QtWebKit.QWebPage):
def __init__(self):
QtWebKit.QWebPage.__init__(self)
self.mainFrame().setScrollBarPolicy(
QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff)
self.mainFrame().setScrollBarPolicy(
QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff)
self.mainFrame().loadFinished.connect(self.handleLoadFinished)
printer = QtGui.QPrinter()
printer.setPaperSize(QtGui.QPrinter.A4)
self.setViewportSize(printer.paperSize(
QtGui.QPrinter.DevicePixel).toSize())
def capture(self, url):
self._url = QtCore.QUrl(url)
QtCore.QTimer.singleShot(0, self.handleLoad)
def handleLoad(self):
self.mainFrame().load(self._url)
def handleLoadFinished(self):
image = QtGui.QImage(self.viewportSize(),
QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(image)
self.mainFrame().render(painter)
painter.end()
output = QtCore.QFile()
output.open(1, QtCore.QIODevice.WriteOnly)
image.save(output, 'PNG')
sys.exit(0)
if __name__ == '__main__':
import sys, signal
app = QtGui.QApplication(sys.argv)
signal.signal(signal.SIGINT, signal.SIG_DFL)
page = WebPage()
page.capture(sys.argv[1])
sys.exit(app.exec_())https://stackoverflow.com/questions/20028183
复制相似问题