Python PySide.QtWebKit.QWebFrame加载方法参数不正确

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

我正在尝试使用github链接中提供的国际象棋在线游戏网站爬虫:

(我根据原始回购协议创建的分支)

它使用Python2和PyQt4,它们的模块QtWebKit4不再可用

所以,我找到了这个链接:

我不太了解它(什么是sparta?),但我知道有一个名为PySide的库,它有一个可以使用的模块QtWebKit

因此,我尝试修改爬虫程序的代码,只需更改
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”:
全部保存