Как на 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 — он быстрее и устойчивее к некорректной разметке.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.