Как на Python написать скрипт для автоматической очистки текста от HTML-тегов, если данные получены через curl?
Когда вы получаете HTML-данные через curl и передаёте их в Python-скрипт, часто требуется очистить текст от тегов разметки. Рассмотрим несколько подходов.
**Способ 1: Использование регулярных выражений (модуль re)**
Самый простой, но не самый надёжный способ:
python
import re
import subprocess
def clean_html(text):
clean = re.compile(»)
return re.sub(clean, », text)
# Получаем данные через curl
result = subprocess.run([‘curl’, ‘-s’, ‘https://example.com’], capture_output=True, text=True)
html = result.stdout
clean_text = clean_html(html)
print(clean_text)
Регулярные выражения подходят для простых случаев, но могут не справиться с вложенными тегами, комментариями или CDATA-секциями.
**Способ 2: Использование BeautifulSoup (рекомендуется)**
Более надёжный подход с библиотекой BeautifulSoup:
python
import subprocess
from bs4 import BeautifulSoup
def clean_html_bs4(html):
soup = BeautifulSoup(html, ‘html.parser’)
# Удаляем скрипты и стили
for tag in soup([‘script’, ‘style’, ‘head’]):
tag.decompose()
return soup.get_text(separator=’ ‘, strip=True)
result = subprocess.run([‘curl’, ‘-s’, ‘https://example.com’], capture_output=True, text=True)
html = result.stdout
clean_text = clean_html_bs4(html)
print(clean_text)
Метод `get_text()` извлекает только текстовое содержимое, игнорируя все теги. Параметр `separator` позволяет задать разделитель между блоками текста.
**Способ 3: Использование lxml**
python
from lxml import etree
import subprocess
def clean_html_lxml(html):
parser = etree.HTMLParser()
tree = etree.fromstring(html.encode(), parser)
return ‘ ‘.join(tree.itertext())
result = subprocess.run([‘curl’, ‘-s’, ‘https://example.com’], capture_output=True, text=True)
html = result.stdout
print(clean_html_lxml(html))
**Способ 4: Передача данных из curl через stdin**
Если curl запускается отдельно и передаёт данные в скрипт через пайп:
python
import sys
from bs4 import BeautifulSoup
html = sys.stdin.read()
soup = BeautifulSoup(html, ‘html.parser’)
for tag in soup([‘script’, ‘style’]):
tag.decompose()
print(soup.get_text(separator=’n’, strip=True))
Запуск: `curl -s https://example.com | python3 clean.py`
**Дополнительная обработка текста**
После удаления тегов рекомендуется:
— Удалить лишние пробелы: `re.sub(r’s+’, ‘ ‘, text).strip()`
— Декодировать HTML-сущности: используйте `html.unescape()` из стандартной библиотеки
— Нормализовать переносы строк
**Установка зависимостей:**
bash
pip install beautifulsoup4 lxml requests
Для большинства задач рекомендуется BeautifulSoup с парсером lxml — он быстрее и устойчивее к некорректной разметке.
