Не могу использовать QUrl
Я пытаюсь научиться динамическому веб-скребку на PyQt5. Я искал учебники, предназначенные для PyQt4, поэтому у меня есть несколько разных библиотек в Qt5.
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEnginePage
import bs4 as bs
import urllib.request
class Client(QWebEnginePage):
def _init_(self, url):
self.app=QApplication(sys.argv)
QWebPage._init_(self)
self.loadFinished.connect(self.on_page_load)
self.mainFrame().load(QUrl(url))
self.app.exec_()
def on_page_load(self):
self.app.quit()
url='https://pythonprogramming.net/parsememcparseface/'
client_response=Client(url)
source=client_response.mainFrame().toHtml()
#sauce=urllib.request.urlopen('https://pythonprogramming.net/sitemap.xml').read()
soup=bs.BeautifulSoup(sauce,'xml')
js_test=soup.find('p',class_='jstest')
print(js_test.text)
Следующая ошибка показывается:
Traceback (most recent call last):
File "jsp.py", line 19, in <module>
client_response=Client(url)
TypeError: arguments did not match any overloaded call:
QWebEnginePage(parent: QObject = None): argument 1 has unexpected type 'str'
QWebEnginePage(QWebEngineProfile, parent: QObject = None): argument 1 has unexpected
Кто-нибудь Помогите мне!
1 ответ
Решение
В вашем коде есть несколько ошибок:
- init должен иметь 2 подчеркивания до и после.
QWebEnginePage
не имеетmainFrame()
как метод, теперь вы должны загрузить его напрямую- Другое возникшее изменение заключалось в том, что
toHtml()
функция больше не является синхронной, поэтому она запросит обратный вызов для получения html, но с моей модификацией она снова будет синхронной.
Код:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl, pyqtSignal, QEventLoop
from PyQt5.QtWebEngineWidgets import QWebEnginePage
class Client(QWebEnginePage):
toHtmlFinished = pyqtSignal()
def __init__(self, url):
self.app=QApplication(sys.argv)
QWebEnginePage.__init__(self)
self.loadFinished.connect(self.on_page_load)
self.load(QUrl(url))
self.app.exec_()
def on_page_load(self):
self.app.quit()
def store_html(self, html):
self.html = html
self.toHtmlFinished.emit()
def get_html(self):
self.toHtml(self.store_html)
loop = QEventLoop()
self.toHtmlFinished.connect(loop.quit)
loop.exec_()
return self.html
url='https://pythonprogramming.net/parsememcparseface/'
client_response=Client(url)
source=client_response.get_html()
print(source)
Рекомендации: