Метод загрузки PySide.QtWebKit.QWebFrame с неверными параметрами - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь поиграть на гусеничном сайте для игры в шахматы, доступном по этой ссылке на github:

https://github.com/Rseiji/ChessCommentaryGeneration (форк, который я создал из исходного репо)

Он использует Python2 и PyQt4, модуль которого QtWebKit4 больше не доступен.

Итак, я нашел эту ссылку:

Python 2.7.11 - ImportError: не могу импортировать имя QtWebKit - Kali Linux / Debian 8

Я не очень хорошо понял (что такое sparta?), но я понял, что есть библиотека с именем PySide, в которой есть модуль QtWebKit, который можно использовать.

Поэтому я попытался изменить код сканера, просто изменив import lines

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)

Он не указывает никакой строки кода и постоянно повторяет это сообщение.

Что я могу сделать?

Спасибо!

1 Ответ

1 голос
/ 06 апреля 2020

Хотя PyQt4 и PySide являются обертками Qt4, они не совместимы друг с другом, и это является причиной ошибки. Решение состоит в том, чтобы использовать PyQt4 или PySide, а не оба. В этом случае код для PySide:

import argparse
import functools
from lxml import html
import pickle
import sys
import time


# from PyQt4 import QtCore, QtGui, QtWebKit
from PySide import QtCore, QtGui, QtWebKit


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(QtWebKit.QWebPage):
    def __init__(self, url):
        self.app = QtGui.QApplication(sys.argv)
        QtWebKit.QWebPage.__init__(self)
        self.loadFinished.connect(self._loadFinished)
        qurl = QtCore.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()
...