Python QtWebKit 将网页保存到文件
Posted
技术标签:
【中文标题】Python QtWebKit 将网页保存到文件【英文标题】:Python QtWebKit save webpage to file 【发布时间】:2011-09-15 15:14:53 【问题描述】:将使用 QWebView() 显示的网页保存到文件的最佳和最简单的方法是什么?
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
from PyQt4.QtGui import *
from PyQt4.QtScript import *
import sys
import time
currentfile = "test.htm"
app = QApplication(sys.argv)
web = QWebView()
web.load(QUrl("http://news.google.com"))
web.show()
data = web.page().currentFrame().documentElement().toInnerXml()
open(currentfile,"w").write(data)
sys.exit(app.exec_())
【问题讨论】:
【参考方案1】:由于页面加载是异步的,您必须等待loadFinished
信号才能尝试保存。
然后您可以使用 web.page().currentFrame().tohtml()
检索页面内容,它返回一个 python unicode 字符串,您可以使用 codecs 模块将其写入文件:
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtWebKit import *
import sys
import codecs
class Downloader(QObject):
# To be emitted when every items are downloaded
done = Signal()
def __init__(self, urlList, parent = None):
super(Downloader, self).__init__(parent)
self.urlList = urlList
self.counter = 0
# As you probably don't need to display the page
# you can use QWebPage instead of QWebView
self.page = QWebPage(self)
self.page.loadFinished.connect(self.save)
self.startNext()
def currentUrl(self):
return self.urlList[self.counter][0]
def currentFilename(self):
return self.urlList[self.counter][1]
def startNext(self):
print "Downloading %s..."%self.currentUrl()
self.page.mainFrame().load(self.currentUrl())
def save(self, ok):
if ok:
data = self.page.mainFrame().toHtml()
with codecs.open(self.currentFilename(), encoding="utf-8", mode="w") as f:
f.write(data)
print "Saving %s to %s."%(self.currentUrl(), self.currentFilename())
else:
print "Error while downloading %s\nSkipping."%self.currentUrl()
self.counter += 1
if self.counter < len(self.urlList):
self.startNext()
else:
self.done.emit()
urlList = [("http://news.google.com", "google.html"),
("http://www.***.com","stack.html"),
("http://www.imdb.com", "imdb.html")]
app = QApplication(sys.argv)
downloader = Downloader(urlList)
# Quit when done
downloader.done.connect(app.quit)
# To view the pages
web = QWebView()
# To prevent user action that would interrupt the current page loading
web.setDisabled(True)
web.setPage(downloader.page)
web.show()
sys.exit(app.exec_())
【讨论】:
非常感谢! ;) 还有一个简单的问题:迭代多个链接的最佳方法是什么? 在save()
函数的末尾,你可以简单地更改currentfile
中的文件名,而不是app.quit()
,然后用下一个url调用web.load()
。
这就是我试图做的,但它并没有真正等待第一个正确加载并在第一个 URL 上生成下载错误......
@Cat 我更新了代码以允许下载多个链接。您得到的错误可能来自与变量范围相关的问题。
alexisdm,有什么方法可以等待 javascript 完成加载,而不仅仅是页面?它仍然只保存基本页面...【参考方案2】:
页面需要先加载 QtWebKit 有什么原因吗?只需使用命令行实用程序 wget 或 curl,就可以完成这项工作。
【讨论】:
以上是关于Python QtWebKit 将网页保存到文件的主要内容,如果未能解决你的问题,请参考以下文章
Python 中无标题 QtWebKit 浏览器中多个网页的屏幕截图
在 QtWebkit 中,如何调用网页的 QNetworkAccessManager::createRequest()?
使用 Python 和 BeautifulSoup(将网页源代码保存到本地文件中)