import tkinter as tk
from tkinter import messagebox, filedialog, scrolledtext
import requests
from bs4 import BeautifulSoup
import feedparser
from tkhtmlview import HTMLLabel

class NewsParser:
    def __init__(self, master):
        self.master = master
        master.title("Парсер новостных лент")

        # Поле для ввода URL
        self.url_label = tk.Label(master, text="Введите URL новостной ленты:")
        self.url_label.pack()

        self.url_entry = tk.Entry(master, width=50)
        self.url_entry.pack()

        # Поле для ввода тега
        self.tag_label = tk.Label(master, text="Введите тег для парсинга (например, 'h2'):")
        self.tag_label.pack()

        self.tag_entry = tk.Entry(master, width=50)
        self.tag_entry.pack()

        # Поле для фильтрации по ключевым словам
        self.filter_label = tk.Label(master, text="Введите ключевые слова для фильтрации (через запятую):")
        self.filter_label.pack()

        self.filter_entry = tk.Entry(master, width=50)
        self.filter_entry.pack()

        # Кнопка парсинга
        self.parse_button = tk.Button(master, text="Парсить", command=self.parse)
        self.parse_button.pack()

        # Кнопка сохранения
        self.save_button = tk.Button(master, text="Сохранить в файл", command=self.save_to_file)
        self.save_button.pack()

        # Поле для вывода HTML результатов
        self.result_label = HTMLLabel(master, width=80, height=15)
        self.result_label.pack()

        # Поле для вывода готового текста
        self.output_text_label = tk.Label(master, text="Готовый текст:")
        self.output_text_label.pack()

        self.output_text = scrolledtext.ScrolledText(master, width=80, height=10, wrap=tk.WORD)
        self.output_text.pack()

        # Кнопка для копирования текста
        self.copy_button = tk.Button(master, text="Копировать текст", command=self.copy_text)
        self.copy_button.pack()

    def parse(self):
        url = self.url_entry.get().strip()
        tag = self.tag_entry.get().strip()
        filter_keywords = [kw.strip().lower() for kw in self.filter_entry.get().split(",")]

        self.result_label.set_html("")  # Очистка поля вывода
        self.output_text.delete(1.0, tk.END)  # Очистка текстового поля

        if not url or not tag:
            messagebox.showwarning("Предупреждение", "Пожалуйста, заполните все поля.")
            return

        try:
            if url.endswith('.rss') or url.endswith('.xml'):
                self.parse_rss(url, tag, filter_keywords)
            else:
                self.parse_html(url, tag, filter_keywords)

        except requests.exceptions.RequestException as e:
            messagebox.showerror("Ошибка", f"Ошибка при запросе: {e}")

    def parse_html(self, url, tag, filter_keywords):
        response = requests.get(url)
        response.raise_for_status()  # Проверка на ошибки
        soup = BeautifulSoup(response.text, 'html.parser')

        results = []
        for item in soup.find_all(tag):
            # Получаем полный HTML-текст элемента
            html_content = str(item)
            text = item.get_text(strip=True)

            # Проверка на наличие ключевых слов
            if any(keyword in text.lower() for keyword in filter_keywords):
                results.append(html_content)
                self.output_text.insert(tk.END, text + '\n')  # Вывод готового текста

        self.display_results(results)

    def parse_rss(self, url, tag, filter_keywords):
        feed = feedparser.parse(url)
        results = []

        for entry in feed.entries:
            title = entry.title
            # Проверка на наличие ключевых слов
            if any(keyword in title.lower() for keyword in filter_keywords):
                results.append(f"<h2>{title}</h2>")  # Обернуть заголовок в тег h2
                self.output_text.insert(tk.END, title + '\n')  # Вывод готового текста

        self.display_results(results)

    def display_results(self, results):
        if results:
            # Соединить все результаты в одну строку HTML
            html_content = "<br><br>".join(results)
            self.result_label.set_html(html_content)
        else:
            self.result_label.set_html("<p>Нет новостей, соответствующих критериям.</p>")

    def copy_text(self):
        # Копировать текст из текстового поля в буфер обмена
        self.master.clipboard_clear()  # Очистка буфера обмена
        text = self.output_text.get(1.0, tk.END)  # Получение текста
        self.master.clipboard_append(text)  # Добавление текста в буфер обмена
        messagebox.showinfo("Копирование", "Текст скопирован в буфер обмена.")

    def save_to_file(self):
        content = self.result_label.get_html()  # Получение текущего HTML
        if not content.strip():
            messagebox.showwarning("Предупреждение", "Нет данных для сохранения.")
            return

        file_path = filedialog.asksaveasfilename(defaultextension=".html", 
                                                   filetypes=[("HTML files", "*.html"), ("All files", "*.*")])
        if file_path:
            with open(file_path, 'w', encoding='utf-8') as file:
                file.write(content)
            messagebox.showinfo("Сохранение", "Данные успешно сохранены.")

if __name__ == "__main__":
    root = tk.Tk()
    app = NewsParser(root)
    root.mainloop()