NameError: имя 'QWebPage' не определено

Я новичок в Python и пытаюсь понять, почему я получаю следующую ошибку:

Traceback (most recent call last):
File "WebScraper.py", line 10, in <module>
    class Render(QWebPage):  
NameError: name 'QWebPage' is not defined

Вот код:

import sys  
from PyQt5.QtGui import *  
from PyQt5.QtCore import *  
from PyQt5.QtWebEngineWidgets import *  
from lxml import html 

#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)  
    self.mainFrame().load(QUrl(url))  
    self.app.exec_()  

  def _loadFinished(self, result):  
    self.frame = self.mainFrame()  
    self.app.quit()  

url = 'http://pycoders.com/archive/'  
r = Render(url)  
result = r.frame.toHtml()
#This step is important.Converting QString to Ascii for lxml to process
archive_links = html.fromstring(str(result.toAscii()))
print(archive_links)

Я понимаю __init__ действует как конструктор, но почему он не устанавливает его self? Поэтому мне нужно изменить его на что-то вроде QWebPage.x = self?

2 ответа

Решение

Вы не импортируете QWebPage

Попробуйте добавить этот импорт в начало вашего скрипта:

from PyQt5.QtWebKitWidgets import QWebPage

Какую версию PyQt5 вы используете? Обратите внимание, что начиная с PyQt5.9, QtWebKitWidgets (а также QtWebKit) больше не доступны (не рекомендуется), что приводит к получаемой вами ошибке.

Позвольте мне сопоставить две функции рендеринга, одну из которых использует old (PyQt4), а другую - последний PyQt5:

Используя PyQt4, обратите внимание на использование QWebPage и, конечно, импорт


from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *

class Render(QWebPage):
    """Render HTML with PyQt4 WebEngine."""  
    def __init__(self, url):  
        self.app = QApplication(sys.argv)  
        QWebPage.__init__(self)  
        self.loadFinished.connect(self._loadFinished)  
        self.mainFrame().load(QUrl(url))  
        self.app.exec_()  

    def _loadFinished(self, result):  
        self.frame = self.mainFrame()  
        self.app.quit()

Используя PyQt5, обратите внимание на использование QWebEngineView вместо QWebPage и, конечно, импорт

 from PyQt5.QtCore import QEventLoop
 from PyQt5.QtWebEngineWidgets import QWebEngineView
 from PyQt5.QtWidgets import QApplication

    class Render(QWebEngineView):
        """Render HTML with PyQt5 WebEngine."""

        def __init__(self, html):
            self.html = None
            self.app = QApplication(sys.argv)
            QWebEngineView.__init__(self)
            self.loadFinished.connect(self._loadFinished)
            self.setHtml(html)
            while self.html is None:
                self.app.processEvents(
                    QEventLoop.ExcludeUserInputEvents |
                    QEventLoop.ExcludeSocketNotifiers |
                    QEventLoop.WaitForMoreEvents)
            self.app.quit()
Другие вопросы по тегам