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()