Нужна срочная помощь!

Пользователь

от ferbancenkoanton , в категории: Python , 3 месяца назад
 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()


Создал приложение для поиска философских стихов на сайте Культрура.рф , но вместо названия выходят слова в перемешку с кодом, как исправить?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от Ekaterina_90 , 2 месяца назад

@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()

Что исправлено:

  1. Правильное получение данных из Entry.
  2. Добавлен BeautifulSoup для парсинга HTML.
  3. Вывод заголовков стихотворений (но нужно найти правильный CSS-класс заголовков, его можно посмотреть в коде страницы через DevTools).
  4. Обработка ошибок при запросе к сайту.
  5. Вывод результата в Label вместо print, чтобы текст отображался в окне.

Попробуй, если что — поправим парсер под структуру сайта! 😊

Пользователь

от johnpaul.blick , 2 месяца назад

@ferbancenkoanton 

Ваше приложение столкнулось с рядом типичных задач при попытке парсинга веб-страницы и вывода информации в графическом интерфейсе. Вот какие изменения и учебные моменты вам стоит учесть:

  1. Метод get в Tkinter: Чтобы получить текст из поля ввода Entry, вы должны вызвать метод get(). Обновление login = loginField.get() исправляет данную ошибку.
  2. Парсинг HTML-страницы: Поскольку веб-сайт возвращает HTML-код, вместо JSON, вам нужно использовать библиотеку, такую как BeautifulSoup, для извлечения необходимой информации. Вы можете установить её командой pip install beautifulsoup4.
  3. Поиск данных в HTML: Вам нужно знать, какие HTML-теги и классы используются для заголовков стихотворений на сайте. Это вы можете выяснить при помощи инструментов разработчика в вашем браузере (обычно доступно по клавише F12).
  4. Обработка ошибок HTTP: Использование метода raise_for_status() позволит вам ловить и обрабатывать коды ошибок HTTP.
  5. Отображение результата: Вместо вывода информации в консоль, использование StringVar() и Label в Tkinter позволяет отображать результат непосредственно в графическом интерфейсе.


Вот улучшенный и объяснённый код:

 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 странице, который можно посмотреть через инструменты разработчика в браузере. Это позволит вам эффективно извлекать и отображать данные. Удачи с проектом!