Python PySide.QtWebKit.QWebFrame加载方法参数不正确
我正在尝试使用github链接中提供的国际象棋在线游戏网站爬虫: (我根据原始回购协议创建的分支) 它使用Python2和PyQt4,它们的模块QtWebKit4不再可用 所以,我找到了这个链接: 我不太了解它(什么是sparta?),但我知道有一个名为PySide的库,它有一个可以使用的模块QtWebKit 因此,我尝试修改爬虫程序的代码,只需更改Python PySide.QtWebKit.QWebFrame加载方法参数不正确,python,pyqt4,pyside,qtwebkit,Python,Pyqt4,Pyside,Qtwebkit,我正在尝试使用github链接中提供的国际象棋在线游戏网站爬虫: (我根据原始回购协议创建的分支) 它使用Python2和PyQt4,它们的模块QtWebKit4不再可用 所以,我找到了这个链接: 我不太了解它(什么是sparta?),但我知道有一个名为PySide的库,它有一个可以使用的模块QtWebKit 因此,我尝试修改爬虫程序的代码,只需更改import行 import sys from PyQt4.QtGui import * from PyQt4.QtCore import
import
行
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
#from PyQt4.QtWebKit import *
from PySide.QtWebKit import *
from lxml import html
import pickle
import time
from PyQt4 import QtGui, QtCore
import functools
import sys
import argparse
def parseArguments():
parser = argparse.ArgumentParser()
#parser.add_argument("-typ", dest="typ", help="home or subsequent", default='home')
parser.add_argument("-i", type=int, dest="i", help="i")
parser.add_argument("-num", type=int, dest="num", help="num")
args = parser.parse_args()
return args
params = parseArguments()
#typ = params.typ
#Take this class for granted.Just use result of rendering.
class Render(QWebPage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
qurl = QUrl(url)
func = functools.partial(self.mainFrame().load, qurl )
timer = QtCore.QTimer()
timer.timeout.connect(func)
timer.start(10000)
self.app.exec_()
def _loadFinished(self, result):
self.frame = self.mainFrame()
self.app.quit()
def save_all():
global cur_url
global html_doc
all_links = pickle.load( open("./saved_files/saved_links.p", "r") )
#extra_links = pickle.load( open("extra_pages.p", "r") )
print "len(all_links) = ",len(all_links)
num = sys.argv[1]
i = params.i
print "i = ",type(i)
num = params.num
url = all_links[i]
if num!=0:
url+="&pg="+str(num)
print "i, url = ",i,url
#This step is important.Converting QString to Ascii for lxml to process
#archive_links = html.fromstring(str(result.toAscii()))
cur_url = url
error_count = 0
try:
r = Render(cur_url)
result = r.frame.toHtml()
html_doc = result.toAscii()
if num==0:
fw = open("./saved_files/saved"+str(i)+".html", "w")
else:
fw = open("./saved_files/saved"+str(i)+"_" + str(num) + ".html", "w")
fw.write(html_doc)
fw.close()
print "---- SLEEPING ---- "
time.sleep(10)
except:
print "ERROR!!"
error_count+=1
print "error_count = ",error_count
##if i>4:
## break
if __name__=="__main__":
save_all()
以前,当使用python run_all.py 0 11577 1执行代码时,错误是QtWebKit
模块,但现在,我得到:
TypeError: 'PySide.QtWebKit.QWebFrame.load' called with wrong argument types:
PySide.QtWebKit.QWebFrame.load(QUrl)
Supported signatures:
PySide.QtWebKit.QWebFrame.load(PySide.QtNetwork.QNetworkRequest, PySide.QtNetwork.QNetworkAccessManager.Operation = QNetworkAccessManager.GetOperation, PySide.QtCore.QByteArray = QByteArray())
PySide.QtWebKit.QWebFrame.load(PySide.QtCore.QUrl)
它不指示任何代码行,并不断重复此消息
我能做什么
谢谢大家! 虽然PyQt4和PySide是Qt4包装器,但它们彼此不兼容,这就是错误的原因。解决方案是使用PyQt4或PySide,而不是两者都使用。在这种情况下,PySide的代码为:
import argparse
导入功能工具
从lxml导入html
进口泡菜
导入系统
导入时间
#从PyQt4导入QtCore、QtGui、QtWebKit
从PySide导入QtCore、QtGui、QtWebKit
def parseArguments():
parser=argparse.ArgumentParser()
#parser.add_参数(“-typ”,dest=“typ”,help=“home或后续”,default=“home”)
add_参数(“-i”,type=int,dest=“i”,help=“i”)
add_参数(“-num”,type=int,dest=“num”,help=“num”)
args=parser.parse_args()
返回参数
params=parseArguments()
#类型=参数类型
#将这个类视为理所当然。只需使用渲染结果即可。
类呈现(QtWebKit.QWebPage):
定义初始化(self,url):
self.app=QtGui.QApplication(sys.argv)
QtWebKit.QWebPage.\uuuuuu init\uuuuuuuuuuuuuu(self)
self.loadFinished.connect(self.\u loadFinished)
qurl=QtCore.qurl(url)
func=functools.partial(self.mainFrame().load,qurl)
计时器=QtCore.QTimer()
timer.timeout.connect(func)
定时器启动(10000)
self.app.exec()
def_加载完成(自身、结果):
self.frame=self.mainFrame()
self.app.quit()
def save_all():
全局cur_url
全局html\U文档
所有链接=pickle.load(打开(“./saved\u files/saved\u links.p”、“r”))
#额外链接=pickle.load(打开(“额外页面.p”、“r”))
打印(“len(所有链接)=”,len(所有链接))
num=sys.argv[1]
i=params.i
打印(“i=”,类型(i))
num=params.num
url=所有链接[i]
如果num!=0:
url+=“&pg=“+str(num)
打印(“i,url=,i,url”)
#这一步很重要。将QString转换为Ascii以便lxml处理
#archive\u links=html.fromstring(str(result.toAscii()))
cur_url=url
错误计数=0
尝试:
r=呈现(当前url)
result=r.frame.toHtml()
html_doc=result.toAscii()
如果num==0:
fw=打开(“./保存的文件/保存的”+str(i)+“.html”,“w”)
其他:
fw=打开(“./已保存的文件/已保存的”+str(i)+“+str(num)+”.html”,“w”)
fw.write(html_文档)
fw.close()
打印(“----睡眠----”)
时间。睡眠(10)
除:
打印(“错误!!”)
错误计数+=1
打印(“错误计数=,错误计数)
##如果i>4:
##中断
如果名称=“\uuuuu main\uuuuuuuu”:
全部保存