Python 在PyQt中从网页检索HTML
我目前正在运行一个python脚本,将给定用户登录到web页面,并在登录后导航到站点上的另一个页面。我的目标是在加载完成后获得最终页面的原始HTML。我尝试了Render类的不同变体,但它似乎抛出了一个“frame不是Render的属性”错误。就像我说的,我的主要目标就是获取页面的HTML。我在做什么Python 在PyQt中从网页检索HTML,python,html,pyqt4,Python,Html,Pyqt4,我目前正在运行一个python脚本,将给定用户登录到web页面,并在登录后导航到站点上的另一个页面。我的目标是在加载完成后获得最终页面的原始HTML。我尝试了Render类的不同变体,但它似乎抛出了一个“frame不是Render的属性”错误。就像我说的,我的主要目标就是获取页面的HTML。我在做什么 url = "https://firstwebpage.com/" url3 = "https://finaldestinationpage.com" #the page that I want
url = "https://firstwebpage.com/"
url3 = "https://finaldestinationpage.com" #the page that I want the HTML from
username = "username"
password = "password"
import sys, signal
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
class Render(QWebPage):
def __init__(self, app, url):
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QUrl(url))
app.exec_()
def _loadFinished(self, result):
self.frame = self.mainFrame()
def JSEval(code):
return webpage.mainFrame().evaluateJavaScript(code)
def onLoadStarted():
print("Loading started: %s" % webpage.mainFrame().url().toString())
def onLoadFinished(result):
print("Loading finished: %s" % webpage.mainFrame().url().toString())
if not result:
print("Request failed")
return
JSEval("_form = document.getElementsByName('loginForm')[0];")
JSEval("_form.username.value='%s';" % username \
+ "_form.password.value='%s';" % password \
+ "_form.submit();")
print("Login data sent")
if webpage.mainFrame().url().toString() == url3:
r = Render(app,url3)
html = r.frame.toHtml() #Here is where the "frame" error comes in
print(html)
app = QApplication(sys.argv)
signal.signal(signal.SIGINT, signal.SIG_DFL)
webpage = QWebPage()
webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished)
webpage.connect(webpage, SIGNAL("loadStarted()"), onLoadStarted)
webpage.mainFrame().load(QUrl(url)) #where user is initally logged in
webpage.mainFrame().load(QUrl(url3))
web = QWebView()
web.setPage(webpage)
web.show()
sys.exit(app.exec_())
在
Render
类中,您在处理程序中为loadFinished
设置了frame
属性,但使用该属性时,您会在创建Render
实例后立即尝试访问它。到那时,页面尚未加载的可能性非常高,因此信号尚未触发,因此r.frame
将不会退出
如果您想要获取页面的html内容,则只能在页面完成加载后进行,因此最好在信号处理程序中进行
哦,你不应该在Render.\uuu init\uuu
中调用app.exec()