2017-02-09 1 views
1

Я занимаюсь учебным пособием PyQt4 от Sentdex right here. Я пытаюсь следовать, но вместо этого используйте PyQt5. Это простое приложение для очистки веб-страниц. Я следовал вместе с обучающей Sentdex, и я получил здесь:PyQt4 to PyQt5 -> mainFrame() устарел, нужно исправить загрузку веб-страниц

enter image description here

Сейчас я пытаюсь написать то же самое приложение с PyQt5 и это то, что у меня есть:

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) 

Когда я запускаю это , я получаю сообщение:

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

Я пытался несколько различных решений, но никто не работает. Любая помощь будет оценена по достоинству.

EDIT

Вход QUrl (URL) в строке 15 возвращает это значение:

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

Когда я пытаюсь source = client_response.load(QUrl(url)) для линии 26, я в конечном итоге с сообщением :

File "test3.py", line 28, in <module> 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()

Когда я пытаюсь source = client_response.url() я получаю:

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

Похоже MainFrame() является самостоятельным описываемый метод в 'класса Client (QWebEnginePage)', потому что не существует в классе в соответствии с [Qt5 документации] (HTTP: //doc.qt .io/QT-5/qwebenginepage.html). Вы уверены, что в учебнике отсутствует больше? – NineTails

+0

mainFrame() был методом в PyQt4 с QWebPage: http://doc.qt.io/qt-5/qtwebenginewidgets-qtwebkitportingguide.html –

+0

Не зная о webkit, кажется, что mainFrame() был поглощен другими функциями , где вместо этого вы указываете, является ли кадр основным или дочерним фреймом, используя индикатор bool. Например, 'acceptNavigationRequest (const QUrl & url, Тип NavigationType, bool isMainFrame)'. – NineTails

ответ

5

вы должны вызвать QWebEnginePage::toHtml() внутри определения класса. QWebEnginePage::toHtml() принимает функцию указателя или лямбда в качестве параметра, и эта функция указателя должна, в свою очередь, принимать параметр типа 'str' (это параметр, содержащий html страницы). Вот пример кода ниже.

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

Это прекрасно работает, если мне нужно получить только одну страницу. Но если я создаю цикл, в котором загружается страница, каждый цикл цикла python падает. Любая идея, что делать? Сообщения об исключении или ошибке отсутствуют - сам Python выходит из строя, и OSX предлагает отправить отчет об ошибке –

Смежные вопросы