Отображение данных парсера в PyQt

Решил визуализировать парсинг фильмов с сайта imdb.com.
Нужно чтобы при нажатии на кнопку pushButton_title Отображался мой парсер.

Пробовал, но не получалось, решил оставить как есть, в надежде что тут помогут.

Прилагаю код на pyqt:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(720, 700)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 721, 55))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_title = QtWidgets.QLabel(self.horizontalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_title.setFont(font)
        self.label_title.setObjectName("label_title")
        self.horizontalLayout.addWidget(self.label_title)
        self.pushButton_title = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_title.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.pushButton_title.setAutoDefault(False)
        self.pushButton_title.setDefault(False)
        self.pushButton_title.setFlat(False)
        self.pushButton_title.setObjectName("pushButton_title")
        self.horizontalLayout.addWidget(self.pushButton_title)
        self.horizontalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget_2.setGeometry(QtCore.QRect(0, 60, 721, 41))
        self.horizontalLayoutWidget_2.setObjectName("horizontalLayoutWidget_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_2)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_film__id = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.label_film__id.setEnabled(True)
        self.label_film__id.setObjectName("label_film__id")
        self.horizontalLayout_2.addWidget(self.label_film__id)
        self.label_film__name = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.label_film__name.setObjectName("label_film__name")
        self.horizontalLayout_2.addWidget(self.label_film__name)
        self.label_film__year = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.label_film__year.setObjectName("label_film__year")
        self.horizontalLayout_2.addWidget(self.label_film__year)
        self.label_film__rating = QtWidgets.QLabel(self.horizontalLayoutWidget_2)
        self.label_film__rating.setObjectName("label_film__rating")
        self.horizontalLayout_2.addWidget(self.label_film__rating)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 720, 21))
        self.menubar.setObjectName("menubar")
        self.menuMain = QtWidgets.QMenu(self.menubar)
        self.menuMain.setObjectName("menuMain")
        self.menutest = QtWidgets.QMenu(self.menubar)
        self.menutest.setObjectName("menutest")
        MainWindow.setMenuBar(self.menubar)
        self.menubar.addAction(self.menuMain.menuAction())
        self.menubar.addAction(self.menutest.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Парсер GUI"))
        self.label_title.setText(_translate("MainWindow", "Парсер pyqt"))
        self.pushButton_title.setText(_translate("MainWindow", "Показать фильмы"))
        self.label_film__id.setText(_translate("MainWindow", "film_id"))
        self.label_film__name.setText(_translate("MainWindow", "film_name"))
        self.label_film__year.setText(_translate("MainWindow", "film_year"))
        self.label_film__rating.setText(_translate("MainWindow", "film_rating"))
        self.menuMain.setTitle(_translate("MainWindow", "Main"))
        self.menutest.setTitle(_translate("MainWindow", "test"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Код на парсер:

from cgitb import html
from turtle import title
import requests
from bs4 import BeautifulSoup as BS

def create_id():
    i = 0
    def func():
        nonlocal i
        i += 1
        return i
    return func
movie_id = create_id()

r = requests.get("https://www.imdb.com/chart/top/?ref_=nv_mv_250")
html = BS(r.content, 'html.parser')

   for el in html.select(".lister-list > tr"):
    movie_name = el.select('.titleColumn > a')
    movie_year = el.select('.titleColumn > .secondaryInfo')
    movie_point = el.select('.ratingColumn > strong')
    print(str(movie_id()) + movie_name[0].text + movie_year[0].text + movie_point[0].text)

Интерфейс парсера на pyqt


Ответы (1 шт):

Автор решения: S. Nick

Sorry, мне не приглянулась ваша форма, но то что вы задумали может выглядеть примерно так:

import sys
from cgitb import html
from turtle import title
import requests
from bs4 import BeautifulSoup as BS

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


def create_id():
    i = 0
    def func():
        nonlocal i
        i += 1
        return i
    return func


class Thread(QThread):
    stepChanged = pyqtSignal(list)
    
    def __init__(self):
        super().__init__()
        
    def run(self): 
        self.movie_id = create_id()
        r = requests.get("https://www.imdb.com/chart/top/?ref_=nv_mv_250")
        html = BS(r.content, 'html.parser')
            
        for el in html.select(".lister-list > tr"):
            movie_name = el.select('.titleColumn > a')
            movie_year = el.select('.titleColumn > .secondaryInfo')
            movie_point = el.select('.ratingColumn > strong')
#            print(str(self.movie_id()) + movie_name[0].text + movie_year[0].text + movie_point[0].text)

            self.stepChanged.emit([
                str(self.movie_id()), 
                movie_name[0].text,
                movie_year[0].text,
                movie_point[0].text
            ])
            self.msleep(100) 
        self.finished.emit()   


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.centralwidget = QtWidgets.QWidget()
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)        

        self.label_title = QtWidgets.QLabel("Парсер pyqt")
        self.label_title.setObjectName("label_title")
        
        self.pushButton_title = QtWidgets.QPushButton("Start Парсер") 
        self.pushButton_title.clicked.connect(self.btn_clicked)

        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(0)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setHorizontalHeaderLabels(
            ["film_id", "film_name", "film_year", "film_rating"])
        self.tableWidget.verticalHeader().hide()
        self.tableWidget.setAlternatingRowColors(True)
        self.tableWidget.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        
        layout = QGridLayout(self.centralwidget)        
        layout.addWidget(self.label_title, 0, 0, alignment=Qt.AlignCenter)
        layout.addWidget(self.pushButton_title, 0, 1, alignment=Qt.AlignRight)
        layout.addWidget(self.tableWidget, 2, 0, 1, 2)
        
        self.thread = None
        
    def btn_clicked(self):
        if self.thread is None:
            self.tableWidget.setRowCount(0)
            
            self.thread = Thread()
            self.thread.stepChanged.connect(self.onStepChanged)
            self.thread.finished.connect(self.onFinished)
            self.thread.start()
            self.pushButton_title.setText("Stop thread")
        else:
            self.thread.terminate()
            self.thread = None
            self.pushButton_title.setText("Start thread")
        
    def onStepChanged(self, data):
        rowPosition = self.tableWidget.rowCount()
        self.tableWidget.insertRow(rowPosition)
        for i in range(4):
            self.tableWidget.setItem(rowPosition, i, QtWidgets.QTableWidgetItem(data[i])) 

    def onFinished(self):   
        self.thread = None
        self.pushButton_title.setText("Start thread")    
        

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    w = MainWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка