Загрузка данных


import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import re

def get_html_from_url(url):
    """
    Получает HTML содержимое страницы по указанному URL.
    
    Args:
        url (str): URL страницы для парсинга
        
    Returns:
        str: HTML содержимое страницы
    """
    # Заголовки для имитации браузера
    headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 12_3_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15"
    }
    
    # Отправляем GET запрос
    response = requests.get(url, headers=headers)
    
    # Проверяем успешность запроса
    response.raise_for_status()
    
    # Возвращаем HTML содержимое
    return response.text


def parse_html_to_text(html_content):
    """
    Парсит HTML содержимое и извлекает текстовое содержимое страницы.
    
    Args:
        html_content (str): HTML содержимое страницы
        
    Returns:
        str: Текстовое содержимое страницы
    """
    # Создаем объект BeautifulSoup
    soup = BeautifulSoup(html_content, 'lxml')
    
    # Удаляем скрипты и стили (они не нужны для текста)
    for script in soup(["script", "style"]):
        script.decompose()
    
    # Получаем текст из всех элементов
    text = soup.get_text()
    
    # Очищаем текст от лишних пробелов и переносов строк
    lines = (line.strip() for line in text.splitlines())
    chunks = (phrase.strip() for line in lines for phrase in line.split("  "))
    text = '\n'.join(chunk for chunk in chunks if chunk)
    
    return text


def generate_filename_from_url(url):
    """
    Генерирует имя файла на основе URL.
    
    Args:
        url (str): URL страницы
        
    Returns:
        str: Имя файла на основе URL
    """
    # Парсим URL
    parsed = urlparse(url)
    
    # Получаем путь (path) из URL
    path = parsed.path.strip('/')
    
    # Если путь пустой, используем домен
    if not path:
        path = parsed.netloc
    
    # Заменяем слэши на дефисы
    filename = path.replace('/', '-')
    
    # Удаляем недопустимые символы для имени файла
    filename = re.sub(r'[<>:"|?*]', '', filename)
    
    # Ограничиваем длину имени файла (максимум 255 символов для большинства файловых систем)
    if len(filename) > 200:
        filename = filename[:200]
    
    # Если имя пустое, используем дефолтное имя
    if not filename:
        filename = "parsed_page_content"
    
    # Добавляем расширение .txt
    return f"{filename}.txt"


if __name__ == "__main__":
    url = "https://edadeal.ru/journal/241121-salad-recipes-olivier/"
    
    # Генерируем имя файла на основе URL
    output_file = generate_filename_from_url(url)
    
    try:
        # Получаем HTML
        html_content = get_html_from_url(url)
        
        # Парсим HTML и извлекаем текст
        text_content = parse_html_to_text(html_content)
        
        # Сохраняем результат в файл
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(f"URL: {url}\n")
            f.write("=" * 80 + "\n\n")
            f.write(text_content)
        
        print(f"Результат успешно сохранен в файл: {output_file}")
        print(f"Размер файла: {len(text_content)} символов")
        
    except requests.exceptions.RequestException as e:
        print(f"Ошибка при получении страницы: {e}")
    except Exception as e:
        print(f"Ошибка при парсинге HTML: {e}")