1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
from tkinter import * import requests def get_idea(): login=loginField.get url ="https://www.culture.ru/literature/poems/tag-filosofskie?ysclid=m60thk97nl659956236" params={"q":login} result = requests.get(url, params=params) print(str(result.text)) proba = Tk() proba["bg"]="white" proba.title("СтихИя") proba.geometry("500x500") proba.resizable(width=False, height=False) canvas=Canvas(proba, height=500, width=500) canvas.pack() frame=Frame(proba, bg="white") frame.place( relwidth=1, relheight=1) title=Label(frame, text="Сборник философских стихотворений", bg="red",font=20) title.pack() loginField = Entry(frame, bg='white', font=30) loginField.pack() btn=Button(frame, text="Найти себя", bg="red", command=get_idea) btn.pack() proba.mainloop() |
Создал приложение для поиска философских стихов на сайте Культрура.рф , но вместо названия выходят слова в перемешку с кодом, как исправить?
@ferbancenkoanton У тебя есть несколько проблем в коде:
Ошибка при получении данных из поля ввода
login=loginField.get, но .get — это метод, его нужно вызывать:
1
|
login = loginField.get() |
Некорректный запрос к сайту
Ты передаёшь params={"q": login}, но сайт Культура.рф не использует такой параметр поиска (по крайней мере, не очевидно). Скорее всего, ты просто получаешь HTML-код страницы, а не JSON с данными.
Парсинг результата
Страница возвращает HTML, а не JSON, поэтому тебе нужно парсить его. Для этого можно использовать BeautifulSoup из библиотеки bs4. Установи её командой:
1
|
pip install beautifulsoup4 |
И исправь код следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
from tkinter import * import requests from bs4 import BeautifulSoup def get_idea(): login = loginField.get() # Правильное получение текста url = "https://www.culture.ru/literature/poems/tag-filosofskie" try: result = requests.get(url) result.raise_for_status() # Проверка на ошибки soup = BeautifulSoup(result.text, "html.parser") # Найдём заголовки стихотворений (Примерно, может отличаться) titles = soup.find_all("h2", class_="some-title-class") # Заменить на реальный класс заголовков poems = [t.text.strip() for t in titles] if poems: output_text.set("\n".join(poems[:5])) # Показываем 5 заголовков else: output_text.set("Стихи не найдены.") except requests.exceptions.RequestException as e: output_text.set(f"Ошибка: {e}") proba = Tk() proba["bg"] = "white" proba.title("СтихИя") proba.geometry("500x500") proba.resizable(width=False, height=False) canvas = Canvas(proba, height=500, width=500) canvas.pack() frame = Frame(proba, bg="white") frame.place(relwidth=1, relheight=1) title = Label(frame, text="Сборник философских стихотворений", bg="red", font=20) title.pack() loginField = Entry(frame, bg='white', font=30) loginField.pack() btn = Button(frame, text="Найти стихи", bg="red", command=get_idea) btn.pack() output_text = StringVar() output_label = Label(frame, textvariable=output_text, bg="white", wraplength=400, justify=LEFT) output_label.pack() proba.mainloop() |
Entry.BeautifulSoup для парсинга HTML.Label вместо print, чтобы текст отображался в окне.Попробуй, если что — поправим парсер под структуру сайта! 😊
@ferbancenkoanton
Ваше приложение столкнулось с рядом типичных задач при попытке парсинга веб-страницы и вывода информации в графическом интерфейсе. Вот какие изменения и учебные моменты вам стоит учесть:
Вот улучшенный и объяснённый код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
from tkinter import *
import requests
from bs4 import BeautifulSoup
def get_idea():
login = loginField.get() # Получение текста из Entry
url = "https://www.culture.ru/literature/poems/tag-filosofskie"
try:
result = requests.get(url)
result.raise_for_status() # Проверка на ошибки HTTP
soup = BeautifulSoup(result.text, "html.parser")
# Найдите правильные теги и классы для заголовков на сайте
titles = soup.find_all("h2", class_="some-title-class") # Подкорректируйте с реальными данными
poems = [t.text.strip() for t in titles] # Извлечение текста заголовков
if poems:
output_text.set("
".join(poems[:5])) # Вывод первых пяти заголовков
else:
output_text.set("Стихи не найдены.")
except requests.exceptions.RequestException as e:
output_text.set(f"Ошибка: {e}") # Обработка ошибок
proba = Tk()
proba["bg"] = "white"
proba.title("СтихИя")
proba.geometry("500x500")
proba.resizable(width=False, height=False)
canvas = Canvas(proba, height=500, width=500)
canvas.pack()
frame = Frame(proba, bg="white")
frame.place(relwidth=1, relheight=1)
title = Label(frame, text="Сборник философских стихотворений", bg="red", font=20)
title.pack()
loginField = Entry(frame, bg='white', font=30)
loginField.pack()
btn = Button(frame, text="Найти стихи", bg="red", command=get_idea)
btn.pack()
output_text = StringVar()
output_label = Label(frame, textvariable=output_text, bg="white", wraplength=400, justify=LEFT)
output_label.pack()
proba.mainloop()
|
Чтобы корректно извлекать заголовки стихотворений, вам нужно будет изменить "some-title-class" на актуальное имя класса, используемого в HTML странице, который можно посмотреть через инструменты разработчика в браузере. Это позволит вам эффективно извлекать и отображать данные. Удачи с проектом!