> **Источник:** https://python-all.ru/2.7/library/htmllib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 19.3. [`htmllib`](https://python-all.ru/2.7/library/htmllib.html#module-htmllib) – Парсер HTML-документов

Устарело с версии 2.6: Модуль [`htmllib`](https://python-all.ru/2.7/library/htmllib.html#module-htmllib) удалён в Python 3. В Python 2 используйте [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#module-HTMLParser), а в Python 3 – его аналог `html.parser`.

Этот модуль определяет класс, который может служить основой для разбора текстовых файлов, отформатированных на языке гипертекстовой разметки (HTML). Класс не занимается напрямую вводом-выводом – ему необходимо передавать входные данные в виде строки через метод, и он вызывает методы объекта «форматтер» для формирования вывода. Класс [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#HTMLParser.HTMLParser) предназначен для использования в качестве базового класса для других классов с целью добавления функциональности и позволяет расширять или переопределять большинство своих методов. В свою очередь, этот класс наследуется от класса `SGMLParser`, определённого в модуле [`sgmllib`](https://python-all.ru/2.7/library/sgmllib.html#module-sgmllib), и расширяет его. Реализация [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#HTMLParser.HTMLParser) поддерживает язык HTML 2.0, описанный в [**RFC 1866**](https://python-all.ru/2.7/library/htmllib.html). В модуле [`formatter`](https://python-all.ru/2.7/library/formatter.html#module-formatter) предоставлены две реализации объектов-форматтеров; обратитесь к документации этого модуля за информацией об интерфейсе форматтера.

Ниже приведена сводка интерфейса, определённого в [`sgmllib.SGMLParser`](https://python-all.ru/2.7/library/sgmllib.html#sgmllib.SGMLParser):

- Интерфейс для передачи данных экземпляру – метод `feed()`, который принимает строковый аргумент. Его можно вызывать с любым объёмом текста за раз; `p.feed(a); p.feed(b)` имеет тот же эффект, что и `p.feed(a+b)`. Когда данные содержат полные конструкции HTML-разметки, они обрабатываются немедленно; неполные конструкции сохраняются в буфере. Чтобы принудительно обработать все необработанные данные, вызовите метод `close()`.

  Например, чтобы разобрать всё содержимое файла, используйте:

  ```python
  parser.feed(open('myfile.html').read())
  parser.close()
  ```
- Интерфейс для определения семантики HTML-тегов очень прост: создайте производный класс и определите методы с именами `start_tag()`, `end_tag()` или `do_tag()`. Парсер будет вызывать их в соответствующие моменты: `start_tag()` или `do_tag()` вызывается, когда встречается открывающий тег вида `<tag ...>`; `end_tag()` вызывается, когда встречается закрывающий тег вида `<tag>`. Если открывающий тег требует соответствующего закрывающего тега, например `<H1>` … `</H1>`, класс должен определить метод `start_tag()`; если тег не требует закрывающего тега, например `<P>`, класс должен определить метод `do_tag()`.

Модуль определяет класс парсера и исключение:

#### `class htmllib.HTMLParser(formatter)`

Это базовый класс парсера HTML. Он поддерживает все имена сущностей, требуемые рекомендацией XHTML 1.0 ([https://www.w3.org/TR/xhtml1](https://python-all.ru/2.7/library/htmllib.html)). Он также определяет обработчики для всех элементов HTML 2.0 и многих элементов HTML 3.0 и 3.2.

#### `exception htmllib.HTMLParseError`

Исключение, вызываемое классом [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#HTMLParser.HTMLParser) при обнаружении ошибки во время разбора.

Новое в версии 2.4.

> **См. также**
>
> **Модуль [`formatter`](https://python-all.ru/2.7/library/formatter.html#module-formatter)**
>
> Определение интерфейса для преобразования абстрактного потока событий форматирования в конкретные события вывода для объектов записи.
>
> **Модуль [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#module-HTMLParser)**
>
> Альтернативный парсер HTML, который предоставляет несколько более низкоуровневый взгляд на входные данные, но предназначен для работы с XHTML и не реализует некоторые синтаксические конструкции SGML, не используемые в «развёрнутом HTML» и недопустимые для XHTML.
>
> **Модуль [`htmlentitydefs`](https://python-all.ru/2.7/library/htmllib.html#module-htmlentitydefs)**
>
> Определение замещающего текста для сущностей XHTML 1.0.
>
> **Модуль [`sgmllib`](https://python-all.ru/2.7/library/sgmllib.html#module-sgmllib)**
>
> Базовый класс для [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#HTMLParser.HTMLParser).

## 19.3.1. Объекты HTMLParser

В дополнение к методам тегов, класс [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#HTMLParser.HTMLParser) предоставляет некоторые дополнительные методы и переменные экземпляра для использования внутри методов тегов.

#### `HTMLParser.formatter`

Это экземпляр форматтера, связанный с парсером.

#### `HTMLParser.nofill`

Логический флаг, который должен быть истинным, когда пробельные символы не должны сжиматься, или ложным, когда должны. В общем случае это должно быть истинным только тогда, когда символьные данные должны обрабатываться как «предварительно отформатированный» текст, например внутри элемента `<PRE>`. Значение по умолчанию – ложь. Это влияет на работу `handle_data()` и [`save_end()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.save_end).

#### `HTMLParser.anchor_bgn(href, name, type)`

Этот метод вызывается в начале области привязки (anchor). Аргументы соответствуют атрибутам тега `<A>` с теми же именами. Реализация по умолчанию поддерживает список гиперссылок (определяемых атрибутом `HREF` для тегов `<A>`) в документе. Список гиперссылок доступен как атрибут данных `anchorlist`.

#### `HTMLParser.anchor_end()`

Этот метод вызывается в конце области привязки. Реализация по умолчанию добавляет текстовую метку сноски, используя индекс из списка гиперссылок, созданного [`anchor_bgn()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.anchor_bgn).

#### `HTMLParser.handle_image(source, alt[, ismap[, align[, width[, height]]]])`

Этот метод вызывается для обработки изображений. Реализация по умолчанию просто передаёт значение *alt* методу `handle_data()`.

#### `HTMLParser.save_bgn()`

Начинает сохранение символьных данных в буфере вместо отправки их объекту-форматтеру. Извлеките сохранённые данные через [`save_end()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.save_end). Использование пары [`save_bgn()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.save_bgn) / [`save_end()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.save_end) не может быть вложенным.

#### `HTMLParser.save_end()`

Завершает буферизацию символьных данных и возвращает все данные, сохранённые после предыдущего вызова [`save_bgn()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.save_bgn). Если флаг [`nofill`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.nofill) равен false, пробельные символы сжимаются до одиночных пробелов. Вызов этого метода без предшествующего вызова [`save_bgn()`](https://python-all.ru/2.7/library/htmllib.html#htmllib.HTMLParser.save_bgn) вызовет исключение [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).

# 19.4. [`htmlentitydefs`](https://python-all.ru/2.7/library/htmllib.html#module-htmlentitydefs) – Определения общих сущностей HTML

> **Примечание**
>
> Модуль [`htmlentitydefs`](https://python-all.ru/2.7/library/htmllib.html#module-htmlentitydefs) в Python 3 переименован в `html.entities`. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) при преобразовании исходного кода в Python 3 автоматически адаптирует импорты.

**Исходный код:** [Lib/htmlentitydefs.py](https://python-all.ru/src/2.7/Lib/htmlentitydefs.py)

---

Этот модуль определяет три словаря: `name2codepoint`, `codepoint2name` и `entitydefs`. `entitydefs` используется модулем [`htmllib`](https://python-all.ru/2.7/library/htmllib.html#module-htmllib) для предоставления атрибута [`entitydefs`](https://python-all.ru/2.7/library/htmllib.html#htmlentitydefs.entitydefs) класса [`HTMLParser`](https://python-all.ru/2.7/library/htmlparser.html#HTMLParser.HTMLParser). Приведённое здесь определение содержит все сущности, определённые XHTML 1.0, которые можно обработать с помощью простой текстовой замены в наборе символов Latin-1 (ISO-8859-1).

#### `htmlentitydefs.entitydefs`

Словарь, сопоставляющий определения сущностей XHTML 1.0 с их замещающим текстом в ISO Latin-1.

#### `htmlentitydefs.name2codepoint`

Словарь, отображающий имена HTML-сущностей в кодовые точки Unicode.

Новое в версии 2.3.

#### `htmlentitydefs.codepoint2name`

Словарь, отображающий кодовые точки Unicode в имена HTML-сущностей.

Новое в версии 2.3.
