Как извлекать текст из HTML с помощью Python: 4 надежных метода
TL;DR
Beautiful Soup — самый ясный универсальный метод для извлечения текста из несовершенного HTML.
lxml — хороший выбор, когда важны XPath и высокая скорость парсинга.
Trafilatura лучше, когда цель заключается в извлечении основного текста статьи, а не каждой видимой навигационной метки.
Inscriptis полезен, когда требуется лучшее сохранение разметки текста, таблиц и списков.
Удаляйте скрипты и стили, сохраняйте границы блоков, нормализуйте Unicode и валидируйте по ожидаемому тексту перед хранением.
Каков лучший способ извлечения текста из HTML с помощью Python?
Лучший метод зависит от того, является ли ввод фрагментом, полным документом или отрисованной страницей. Nstdata Crawl может предоставить очищенное или отрисованное исходное содержимое, когда приобретение — это сложная часть; Beautiful Soup, lxml, Trafilatura и Inscriptis решают разные проблемы парсинга после того, как HTML становится доступен. Regex сам по себе не является надежным парсером HTML.
Руководство по проекту веб-скрапинга на Python предоставляет более широкий контекст работы с конвейерами. Извлечение текста должно сохранять достаточную структуру для его назначения: индексирование поиска может потребовать заголовки и абзацы, в то время как компактный классификатор может потребовать нормализованного простого текста.
Что вам нужно перед началом?
Установите четыре библиотеки в изолированной среде. Используйте один общий экземпляр, чтобы результаты можно было справедливо сопоставить.
Метод 1: Используйте Beautiful Soup для удобного общего разбора
Шаг 1: Построить дерево разбора
from bs4 import BeautifulSoup
soup = BeautifulSoup(HTML,"html.parser")
Шаг 2: Удалите узлы, не содержащие содержимое
for node in soup.select("script, style, noscript, template"): node.decompose()
Шаг 3: Сохраните границы и нормализуйте пробелы
lines =[line.strip()for line in soup.get_text("\n").splitlines()]text ="\n".join(line for line in lines if line)print(text)
Beautiful Soup терпит неправильно оформленный разметку и имеет доступный API селекторов. Его ограничение в том, что get_text() не знает, какие видимые блоки являются основным содержимым. Используйте семантические селекторы, такие как main, article или проверенный контейнер содержимого, когда это возможно. Проверьте официальную документацию Beautiful Soup для информации о поведении парсера.
Метод 2: Используйте lxml для XPath и пропускной способности
Шаг 1: Проанализируйте документ
from lxml import html
tree = html.fromstring(HTML)
Шаг 2: Удалите нежелательные элементы
for node in tree.xpath("//script|//style|//noscript|//template"): node.drop_tree()
Шаг 3: Извлеките выбранные текстовые узлы
parts = tree.xpath("//main//text()[normalize-space()]")text ="\n".join(part.strip()for part in parts if part.strip())
lxml быстрый и предоставляет точный контроль XPath, но неосторожный XPath может сгладить значимую структуру или собрать скрытое содержимое. официальная документация lxml.html описывает его HTML помощники.
Метод 3: Используйте Trafilatura для извлечения основного содержимого
Шаг 1: Передайте полный документ
import trafilatura
text = trafilatura.extract(HTML, include_links=False, include_images=False)
Шаг 2: Обработка отсутствующего результата
Trafilatura может не вернуть основное содержимое для коротких, необычных или насыщенных навигацией страниц. Рассматривайте это как сбой валидации и используйте локализованный метод DOM вместо того, чтобы хранить пустой документ.
Шаг 3: Храните метаданные отдельно
Извлечение основного содержимого преднамеренно удаляет шаблонный текст. Если важны заголовок, канонический URL, автор или дата публикации, извлекайте эти поля в метаданные, а не ожидайте, что они останутся после преобразования в простой текст. Проверьте текущие параметры в документации Trafilatura.
Метод 4: Используйте Inscriptis, когда макет имеет значение
Шаг 1: Преобразуйте HTML в текст с учетом макета
from inscriptis import get_text
text = get_text(HTML)
Шаг 2: Проверьте списки и таблицы
Inscriptis стремится лучше сохранить видимый макет, чем простое объединение текстов потомков. Это может помочь с таблицами, списками и документами, где переносы строк передают структуру.
Шаг 3: Нормализуйте для назначения
Не применяйте агрессивное сжатие пробелов, если колонки таблицы или отступы списка имеют значение. Создавайте отдельные профили нормализации для поиска, потребления LLM и архивного обзора.
Как вы получаете HTML перед извлечением текста?
Используйте ограниченный HTTP-клиент для статических страниц и проверяйте статус, тип содержимого, кодировку, конечный URL и ожидаемую идентичность страницы. Если страница требует JavaScript, используйте браузер или управляемый слой рендеринга перед разбором. Nstdata Crawl актуален, когда рендеринг и получение источников должны быть организованы; проконсультируйтесь с текущими ценами на Crawl перед оценкой производственных затрат.
Руководство по веб-скрапингу JavaScript объясняет, когда HTML-парсер не может увидеть содержимое, сгенерированное браузером. Парсер не может восстановить данные, которые никогда не поступили в его ввод.
Для более крупных задач руководство по масштабированию веб-скрапинга объясняет, почему пропускная способность парсера должна оцениваться вместе с очередями, повторными попытками и качеством принимаемых записей.
Как вы очищаете извлеченный текст, не нанося ему вреда?
Нормализуйте Unicode, преобразуйте неразривные пробелы, удалите повторяющиеся пустые строки и сохраняйте границы блоков. Избегайте удаления всех коротких строк, потому что заголовки и метки могут быть короткими. Избегайте преобразования в строчные буквы содержимого, предназначенного для отображения или извлечения сущностей. Храните исходный текст или разрешенный хэш, чтобы можно было изучить регрессию очистки.
Создавайте золотые образцы, содержащие заголовки, абзацы, сущности, списки, таблицы, скрытые узлы, неправильно оформленные теги и текст, не относящийся к ASCII. Сравнивайте точный вывод или структурированное представление блока в автоматизированных тестах. Стандарт WHATWG HTML является основным источником, когда поведение парсера зависит от структуры документа.
Заключение
Используйте Beautiful Soup для понятного общего парсинга, lxml для XPath и производительности, Trafilatura для извлечения текстов статей и Inscriptis, когда важен макет. Оцените методы по одним и тем же образцам и измерьте недостающий контент, шаблоны и сохранение структуры. Когда входной HTML сам по себе неполный, сначала решите проблему получения с помощью браузера или Nstdata Crawl. Для повторяющихся заданий с несколькими источниками прокси Nstdata Proxy Manager может отдельно решать маршрутизацию и парсинг.
Попробуйте Nstdata — начните бесплатный пробный период сегодня
В: Может ли Python извлекать текст из неправильно сформированного HTML?
Да. Beautiful Soup и lxml восстанавливают многие неправильно сформированные документы, но их исправления могут различаться, поэтому протестируйте выбранный парсер на репрезентативных образцах.
В: Почему get_text включает JavaScript или CSS?
Парсер рассматривает содержимое скриптов и стилей как текстовые узлы, если эти элементы не удалены. Разложите их, прежде чем извлекать текст.
В: Подходит ли regex для удаления HTML тегов?
Regex может очистить известный фрагмент, но это не надежный общий HTML парсер, поскольку вложенность, неправильно сформированный разметка, сущности и встроенные языки усложняют грамматику.
В: Как извлечь только текст статьи?
Используйте проверенный article или селектор контента, когда шаблон известен, или библиотеку основного контента, такую как Trafilatura, когда шаблоны различаются.
В: Какой метод самый быстрый?
lxml и другие парсеры на основе родных библиотек часто быстрее, чем Beautiful Soup, но производительность следует измерять на реальных документах и с учетом необходимой очистки.
Страницы, рендерящиеся с помощью JavaScript, требуют метода, который соответствует их пути данных. Этот справочник охватывает извлечение сетевых данных, три подхода браузера и управляемый рендеринг.
Ivy Lin
Sep. 28th 2026
Попробуйте Nstproxy Crawl -
Начните Бесплатно Уже Сегодня
Сканируйте целые сайты одним API-запросом
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.