При парсинге сайта выводится не вся информация
Суть приложения: поиск рецептов по ингредиентам.
Набросала интерфейс в 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_())

