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}")