PyQt4 a PyQt5 -> mainFrame () en desuso, necesita una solución para cargar páginas web

Estoy haciendo el tutorial de YouTube de PyQt4 de Sentdex aquí . Estoy tratando de seguir adelante pero uso PyQt5 en su lugar. Es una aplicación de raspado web simple. Seguí el tutorial de Sentdex y llegué aquí:

introduzca la descripción de la imagen aquí

Ahora estoy tratando de escribir la misma aplicación con PyQt5 y esto es lo que tengo:

import os import sys from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QUrl, QEventLoop from PyQt5.QtWebEngineWidgets import QWebEnginePage from bs4 import BeautifulSoup import requests class Client(QWebEnginePage): def __init__(self, url): self.app = QApplication(sys.argv) QWebEnginePage.__init__(self) self.loadFinished.connect(self._loadFinished) self.load(QUrl(url)) self.app.exec_() def _loadFinished(self): self.app.quit() url = 'https://pythonprogramming.net/parsememcparseface/' client_response = Client(url) #I think the issue is here at LINE 26 source = client_response.mainFrame().toHtml() soup = BeautifulSoup(source, "html.parser") js_test = soup.find('p', class_='jstest') print(js_test.text) 

Cuando ejecuto esto, recibo el mensaje:

 source = client_response.mainFrame().toHtml() AttributeError: 'Client' object has no attribute 'mainFrame' 

He intentado algunas soluciones diferentes pero ninguna funciona. Cualquier ayuda sería apreciada.

EDITAR

El registro de QUrl (url) en la línea 15 devuelve este valor:

PyQt5.QtCore.QUrl('https://pythonprogramming.net/parsememcparseface/')

Cuando bash source = client_response.load(QUrl(url)) para la línea 26, termino con el mensaje:

File "test3.py", line 28, in soup = BeautifulSoup(source, "html.parser") File "/Users/MYNAME/.venv/qtproject/lib/python3.6/site-packages/bs4/__init__.py", line 192, in __init__ elif len(markup) <= 256 and ( TypeError: object of type 'NoneType' has no len()

Cuando bash source = client_response.url() obtengo:

 soup = BeautifulSoup(source, "html.parser") File "/Users/MYNAME/.venv/qtproject/lib/python3.6/site-packages/bs4/__init__.py", line 192, in __init__ elif len(markup) <= 256 and ( TypeError: object of type 'QUrl' has no len() 

debe llamar a QWebEnginePage::toHtml() dentro de la definición de la clase. QWebEnginePage::toHtml() toma una función de puntero o un lambda como parámetro, y esta función de puntero debe a su vez tomar un parámetro de tipo ‘str’ (este es el parámetro que contiene el html de la página). Aquí está el código de ejemplo a continuación.

 import bs4 as bs import sys import urllib.request from PyQt5.QtWebEngineWidgets import QWebEnginePage from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QUrl class Page(QWebEnginePage): def __init__(self, url): self.app = QApplication(sys.argv) QWebEnginePage.__init__(self) self.html = '' self.loadFinished.connect(self._on_load_finished) self.load(QUrl(url)) self.app.exec_() def _on_load_finished(self): self.html = self.toHtml(self.Callable) print('Load finished') def Callable(self, html_str): self.html = html_str self.app.quit() def main(): page = Page('https://pythonprogramming.net/parsememcparseface/') soup = bs.BeautifulSoup(page.html, 'html.parser') js_test = soup.find('p', class_='jstest') print js_test.text if __name__ == '__main__': main() 

Nunca es demasiado tarde … Obtuve el mismo problema y encontré su descripción aquí: http://pyqt.sourceforge.net/Docs/PyQt5/gotchas.html#crashes-on-exit

Seguí el consejo de poner la aplicación de Q en una variable global (sé que está sucia … y me castigarán por eso) y funciona “bien”. Puedo bucear sin ningún tipo de accidente.

Espero que esto ayude.