При парсинге сайта выводится не вся информация

Суть приложения: поиск рецептов по ингредиентам.
Набросала интерфейс в Qt Designer.

Для парсинга использую библиотеки requests, BeautifulSoup.
Данные беру с сайта russianfood.com.

Возникла проблема с выводом. Заголовок выводится только у первого блюда, а у всех последующих только описание и ингредиенты.
В программе указывала класс class_='recipe_l in_seen v2', в котором находится и название, и описание, и ингредиенты блюда.

Не понимаю, почему не находятся все названия.

Вот часть кода с парсингом:

        url='https://www.russianfood.com/recipes/bytype/?fid=99&&ysclid=lpoeqyhssm204386307'
        page = requests.get(url)
        self.ingr = []
        recipes = []
        soup = BeautifulSoup(page.text, "html.parser")
        recipes = soup.findAll('div', class_='recipe_l in_seen v2')
        for data in recipes:
            if data.find('div', class_='ingr_str') is not None:
                self.ingr.append(data.text.strip())

main.py:

import requests
from bs4 import BeautifulSoup
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(550, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("background-color: rgb(255, 192, 225);")

        self.frame_2 = QtWidgets.QFrame(MainWindow)
        self.frame_2.setGeometry(QtCore.QRect(0, 0, 551, 80))
        self.frame_2.setStyleSheet("background-color: rgb(146, 136, 152);"
"    border-radius: 10px;\n"
        )
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        
        self.findBut = QtWidgets.QPushButton(self.frame_2)
        self.findBut.setGeometry(QtCore.QRect(430, 20, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.findBut.setFont(font)
        self.findBut.setStyleSheet("QPushButton{\n"
"    border-radius: 10px;\n"
"    font: 75 16pt \"Cooper Black\";\n"
"    background-color: rgb(255, 192, 225);\n"
"}\n"
"QPushButton:hover{\n"
"    \n"
"    background-color: rgb(255, 165, 206);\n"
"}")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../../../../Downloads/free-icon-magnifier-2311526.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.findBut.setIcon(icon)
        self.findBut.setObjectName("findBut")
        self.searchLine = QtWidgets.QLineEdit(self.frame_2)
        self.searchLine.setGeometry(QtCore.QRect(10, 20, 401, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        font.setStrikeOut(False)
        self.searchLine.setFont(font)
        self.searchLine.setStyleSheet("QLineEdit {\n"
"    border: 2px solid rgb(187, 174, 194);\n"
"    border-radius: 10px;\n"
"    color:#FFF;\n"
"    padding-left: 20px;\n"
"    padding-right: 20px;\n"
"    background-color: rgb(121, 113, 126);\n"
"}\n"
"QLineEdit:hover{\n"
"    border: 3px solid rgb(185, 175, 199);\n"
"}\n"
"QLineEdit:focus{\n"
"    border: 3px solid rgb(255, 178, 222);\n"
"    background-color: rgb(109, 102, 120);\n"
"}")
        self.searchLine.setObjectName("searchLine")
        self.recPrint = QtWidgets.QTextBrowser(MainWindow)
        self.recPrint.setGeometry(QtCore.QRect(15, 91, 521, 641))
        self.recPrint.setStyleSheet("background-color: rgb(250, 245, 250);\n"
"border-radius: 10px;")
        self.recPrint.setObjectName("recPrint")
        MainWindow.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.findBut.setText(_translate("MainWindow", "Найти"))
        self.searchLine.setPlaceholderText(_translate("MainWindow", "Введите ингредиенты"))

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)

        layoutH = QtWidgets.QHBoxLayout(self.frame_2)
        layoutH.addWidget(self.searchLine)
        layoutH.addWidget(self.findBut)
        
        layout = QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.frame_2)
        layout.addWidget(self.recPrint)
         
        self.findBut.clicked.connect(self.textRecipe)      

        url='https://www.russianfood.com/recipes/bytype/?fid=99&&ysclid=lpoeqyhssm204386307'
        page = requests.get(url)
        self.ingr = []
        recipes = []
        soup = BeautifulSoup(page.text, "html.parser")
        recipes = soup.findAll('div', class_='recipe_l in_seen v2')
        for data in recipes:
            if data.find('div', class_='ingr_str') is not None:
                self.ingr.append(data.text.strip())

    def textRecipe(self):
        if not self.searchLine.text():
            self.recPrint.moveCursor(QtGui.QTextCursor.Start)
            self.recPrint.insertHtml(
                '<b style="font-size: 22px; color: black">Введите ингредиенты !!!</b> <br><br>')
            return
        self.recPrint.clear()

        for data in self.ingr:
            if self.searchLine.text() in data:
                self.recPrint.insertPlainText(data)    

        if not self.recPrint.toPlainText():
            self.recPrint.moveCursor(QtGui.QTextCursor.Start)
            self.recPrint.insertHtml(
                f'<b style="font-size: 22px; color: black">Нет рецептов по ингредиенту {self.searchLine.text()}!</b> <br><br>')
            
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

скрин приложения

Помогите, пожалуйста!


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

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

Я отметил для вас изменения, которые внес в ваш код, проверьте.

import requests
from bs4 import BeautifulSoup
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(550, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("background-color: rgb(165, 42, 42);")

        self.frame_2 = QtWidgets.QFrame(MainWindow)
        self.frame_2.setGeometry(QtCore.QRect(0, 0, 551, 80))
        self.frame_2.setStyleSheet("background-color: rgb(146, 136, 152);"
"    border-radius: 10px;\n"
        )
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        
        self.findBut = QtWidgets.QPushButton(self.frame_2)
        self.findBut.setGeometry(QtCore.QRect(430, 20, 101, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.findBut.setFont(font)
        self.findBut.setStyleSheet("QPushButton{\n"
"    border-radius: 10px;\n"
"    font: 75 16pt \"Cooper Black\";\n"
"    background-color: rgb(155, 192, 225);\n"
"}\n"
"QPushButton:hover{\n"
"    \n"
"    background-color: rgb(255, 165, 206);\n"
"}")
        icon = QtGui.QIcon()
# ----------------------------------> vv <---- установите свое ------------------
        icon.addPixmap(QtGui.QPixmap("Ok.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.findBut.setIcon(icon)
        self.findBut.setObjectName("findBut")
        self.searchLine = QtWidgets.QLineEdit(self.frame_2)
        self.searchLine.setGeometry(QtCore.QRect(10, 20, 401, 41))
        font = QtGui.QFont()
        font.setFamily("Cooper Black")
        font.setPointSize(16)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        font.setStrikeOut(False)
        self.searchLine.setFont(font)
        self.searchLine.setStyleSheet("QLineEdit {\n"
"    border: 2px solid rgb(187, 174, 194);\n"
"    border-radius: 10px;\n"
"    color:#FFF;\n"
"    padding-left: 20px;\n"
"    padding-right: 20px;\n"
"    background-color: rgb(121, 113, 126);\n"
"}\n"
"QLineEdit:hover{\n"
"    border: 3px solid rgb(185, 175, 199);\n"
"}\n"
"QLineEdit:focus{\n"
"    border: 3px solid rgb(255, 178, 222);\n"
"    background-color: rgb(109, 102, 120);\n"
"}")
        self.searchLine.setObjectName("searchLine")
        self.recPrint = QtWidgets.QTextBrowser(MainWindow)
        self.recPrint.setGeometry(QtCore.QRect(15, 91, 521, 641))
        self.recPrint.setStyleSheet("background-color: rgb(250, 245, 250);\n"
"border-radius: 10px;")
        self.recPrint.setObjectName("recPrint")
        MainWindow.setCentralWidget(self.centralwidget)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.findBut.setText(_translate("MainWindow", "Найти"))
        self.searchLine.setPlaceholderText(_translate("MainWindow", "Введите ингредиенты"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)
# --------------------> vvvvvvvvvvvvv <---- https://doc.qt.io/qt-5/qlineedit.html#returnPressed        
        self.searchLine.returnPressed.connect(self.textRecipe)       # +++ 

        layoutH = QtWidgets.QHBoxLayout(self.frame_2)
        layoutH.addWidget(self.searchLine)
        layoutH.addWidget(self.findBut)
        
        layout = QtWidgets.QVBoxLayout(self.centralwidget)
        layout.addWidget(self.frame_2)
        layout.addWidget(self.recPrint)
         
        self.findBut.clicked.connect(self.textRecipe)      

        url='https://www.russianfood.com/recipes/bytype/?fid=99&&ysclid=lpoeqyhssm204386307'
        page = requests.get(url)
        self.ingr = []
        recipes = []
        soup = BeautifulSoup(page.text, "html.parser")
        recipes = soup.findAll('div', class_='recipe_l in_seen v2')
        for data in recipes:
            if data.find('div', class_='ingr_str') is not None:
#                self.ingr.append(data.text.strip())
# !!! +++
                _data = data.text.strip().replace("\n\n\n", "</b><br>") # !!! +++
                _data = f'<b style="color: blue;">{_data}'              # !!! +++
                self.ingr.append(f'<br>{_data}<br>{"-="*25}<br>')       # !!! +++
        self.searchLine.setFocus()                                      # +++

    def textRecipe(self):
        if not self.searchLine.text():
            self.recPrint.moveCursor(QtGui.QTextCursor.Start)
            self.recPrint.insertHtml(
                '<b style="font-size: 22px; color: black">Введите ингредиенты !!!</b> <br><br>')
            return
        self.recPrint.clear()

        for data in self.ingr:
# ----------------------------------> vvvvvvv <-----> vvvvvvv <--------------
            if self.searchLine.text().lower() in data.lower():      # !!! +++
#                self.recPrint.insertPlainText(data)    
                self.recPrint.insertHtml(data)                      # !!! +++
                
        if not self.recPrint.toPlainText():
            self.recPrint.moveCursor(QtGui.QTextCursor.Start)
            self.recPrint.insertHtml(
                f'<b style="font-size: 22px; color: black">Нет рецептов по ингредиенту {self.searchLine.text()}!</b> <br><br>')

        self.searchLine.setFocus()                                   # +++          
          
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка