перейти к содержанию

Вот сообщение в блоге объемом более 2000 слов на тему «Как превратить HTML в текст в Python?»:

HTML — важный формат для хранения и отображения данных в Интернете. При парсинге веб-страниц мы часто хотим извлечь только видимый текстовый контент из HTML-страниц. В этом посте я рассмотрю различные методы преобразования HTML в чистый текст на Python.

Зачем конвертировать HTML в текст?

Есть несколько основных причин, по которым вам может потребоваться удалить HTML-теги и извлечь только текст:

  • Упростите очищенный контент – При парсинге веб-страниц HTML обычно включает в себя много дополнительной разметки и ненужных нам элементов, например навигационных ссылок. Извлечение основного текста упрощает анализ контента и работу с ним.

  • Удалить форматирование – HTML применяет визуальное форматирование и макет. Для многих приложений, таких как анализ настроений, нам просто нужен текстовый контент без какого-либо форматирования.

  • Хранить в текстовом формате – Может быть полезно извлечь из HTML только текст, чтобы его можно было сохранить в простом формате, например в текстовом файле или в текстовом поле базы данных. Это удалит всю громоздкую HTML-разметку.

  • читабельность – Необработанный HTML-код трудно читать и интерпретировать людям. Преобразование в текст делает его более читабельным.

  • Универсальный доступ – Простой текстовый контент более доступен для программ чтения с экрана, используемых пользователями с нарушениями зрения.

  • Индексирование поисковыми системами – Поисковые системы в значительной степени анализируют и индексируют видимый текстовый контент страниц. Преобразование HTML в текст может помочь проанализировать контент так, как его видят поисковые системы.

Подводя итог, можно сказать, что извлечение текста из HTML полезно для очистки, анализа, хранения и доступности. В следующих разделах рассматриваются различные способы достижения этого в Python.

Удаление HTML-тегов с помощью BeautifulSoup

Beautiful Soup — популярная библиотека Python для очистки веб-страниц и анализа HTML. Мы можем использовать его для довольно легкого извлечения текста из HTML.

Самый простой способ — вызвать get_text() метод либо для объекта BeautifulSoup, либо для элемента, выбранного из проанализированного HTML. Например:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

soup = BeautifulSoup(html, "html.parser")

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

При этом удаляются все теги HTML и возвращается строка, содержащая видимый текст.

Следует отметить, что get_text() по умолчанию также сжимает несколько последовательных символов пробелов в один пробел. Проходить strip=False чтобы сохранить пробелы, такие как символы новой строки и дополнительные пробелы:

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

Чтобы извлечь текст только из части HTML, вызовите get_text() для элемента, а не для всего документа:

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

Одно предостережение заключается в том, что get_text() по-прежнему будет включать любой текст, вложенный внутри дочерних элементов, таких как ссылки. Чтобы удалить и их, передайте recursive=False Аргумент:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

Итак, с BeautifulSoup мы можем легко использовать get_text() для извлечения видимого текста из HTML.

Извлечение текста с помощью lxml

lxml — еще одна популярная библиотека Python для анализа XML и HTML. Мы также можем использовать его для извлечения текста.

Из lxml HTMLParser элемент, вызовите text_content() метод получения текста:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

Это рекурсивно извлечет весь текст, включая дочерние элементы. Чтобы исключить текст из дочерних элементов, передайте children=False Аргумент:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

Таким образом, lxml также предоставляет простой способ отделить HTML и получить только текстовое содержимое.

Обычные выражения

Подход на основе регулярных выражений также можно использовать для удаления тегов HTML. Это предполагает использование шаблона для сопоставления всех тегов HTML и замен для их замены ничем:

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

Регулярное выражение r"<[^>]*>" спички < за которым следует что-нибудь, кроме > один или несколько раз, а затем >, re.sub() call удаляет эти совпадения, эффективно удаляя все теги HTML.

Чтобы также иметь дело с пространствами имен XML и самозакрывающимися тегами:

clean = re.sub(r"<[^>]+>", "", html)

Это быстрый и простой подход на основе регулярных выражений для удаления всех тегов HTML. Хотя он не предлагает такого же контроля и простоты, как определенные библиотеки синтаксического анализа HTML, такие как BeautifulSoup и lxml.

Обработка кодирования

Веб-страницы могут быть закодированы в различных текстовых форматах, таких как ASCII, UTF-8 или ISO-8859-1. При парсинге страниц мы хотим определить кодировку и правильно декодировать текст в Юникоде.

Ассоциация chardet библиотека может автоматически определять кодировку для нас:

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

Затем мы можем явно декодировать байты HTML в строку Unicode перед анализом и извлечением текста.

При преобразовании HTML в текст кодирование должно обрабатываться в первую очередь перед анализом, чтобы избежать ошибок кодирования.

Полный пример преобразования HTML в текст

Вот пример, объединяющий шаги, описанные для надежного извлечения текста из HTML:

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

Это обеспечивает обнаружение кодировки, удаление тегов и извлечение текста в функции многократного использования.

Существуют также библиотеки Python, такие как текст которые инкапсулируют некоторые из этих функций для преобразования различных форматов файлов в текст.

Преобразование HTML-объектов

Другая проблема, с которой мы можем столкнуться, — это использование HTML-символов, таких как   и & вместо буквальных символов.

Мы можем использовать html.unescape() функция из стандарта Python HTML-библиотека чтобы преобразовать сущности обратно в символы:

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

Это можно сделать до или после извлечения текста из HTML.

Обработка JavaScript

Ограничением вышеописанных методов является то, что они извлекают только видимый текст из исходного HTML. Любой текст, динамически добавленный JavaScript, не будет захвачен.

Чтобы выполнить JavaScript и отобразить полный текст, нам нужно использовать безголовый браузер, например Селен or Драматург:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

Здесь Playwright используется для загрузки страницы и выполнения JavaScript, что позволяет нам извлечь полный текст.

Таким образом, для страниц с тяжелыми манипуляциями с JS может потребоваться инструмент автоматизации браузера, если нам требуется полный визуализируемый текст.

Обзор

Существует несколько основных методов преобразования HTML в обычный текст в Python:

  • Используйте get_text() из BeautifulSoup
  • Извлеките контент с помощью text_content() в формате lxml
  • Удаление тегов с помощью регулярных выражений
  • Декодируйте любые кодировки перед анализом
  • Обработка HTML-объектов с помощью html.unescape()
  • Используйте headless-браузер, если необходимо выполнить JavaScript.

Преобразование HTML в текст полезно для упрощения извлеченного контента, анализа текста вместо разметки, улучшения читаемости и доступности, индексации поисковыми системами и хранения в облегченном формате.

Я надеюсь, что этот пост предоставил подробное руководство по основным способам извлечения текста из HTML с помощью Python! Дайте мне знать, если у вас есть какие-либо другие полезные методы.

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *