html.parser.md
1> **Источник:** https://python-all.ru/3.1/library/html.parser.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.1. `html.parser` – Простой парсер HTML и XHTML89Этот модуль определяет класс [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser), который служит основой для разбора текстовых файлов в формате HTML (язык гипертекстовой разметки) и XHTML.1011#### `class html.parser.HTMLParser`1213Класс [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser) создаётся без аргументов.1415Экземпляр [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser) получает HTML-данные и вызывает функции-обработчики при начале и конце тегов. Класс [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser) предназначен для переопределения пользователем, чтобы реализовать нужное поведение.1617Этот парсер не проверяет, соответствуют ли закрывающие теги открывающим, и не вызывает обработчик закрывающего тега для элементов, которые неявно закрываются при закрытии внешнего элемента.1819Также определено исключение:2021#### `exception html.parser.HTMLParseError`2223Исключение, вызываемое классом2425[`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser)2627при возникновении ошибки во время разбора. Это исключение предоставляет три атрибута:2829`msg`3031– краткое сообщение с описанием ошибки,3233`lineno`3435– номер строки, на которой была обнаружена ошибочная конструкция, и3637`offset`3839– количество символов от начала строки до начала конструкции.4041Экземпляры [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser) имеют следующие методы:4243#### `HTMLParser.reset()`4445Сбрасывает экземпляр. Теряет все необработанные данные. Вызывается неявно при создании экземпляра.4647#### `HTMLParser.feed(data)`4849Передаёт парсеру некоторый текст. Текст обрабатывается по мере поступления полных элементов; неполные данные буферизуются до тех пор, пока не будут переданы новые данные или не будет вызван5051[`close()`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser.close)5253.5455#### `HTMLParser.close()`5657Принудительно обрабатывает все буферизованные данные так, как если бы за ними следовал маркер конца файла. Этот метод может быть переопределён в производном классе для добавления обработки в конце входных данных, но переопределённая версия всегда должна вызывать метод базового класса5859[`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser)6061–6263[`close()`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser.close)6465.6667#### `HTMLParser.getpos()`6869Возвращает номер текущей строки и смещение.7071#### `HTMLParser.get_starttag_text()`7273Возвращает текст самого последнего открытого начального тега. Обычно это не требуется для структурированной обработки, но может пригодиться при работе с HTML «как есть» или при повторной генерации входных данных с минимальными изменениями (пробелы между атрибутами можно сохранить и т.д.).7475#### `HTMLParser.handle_starttag(tag, attrs)`7677Этот метод вызывается для обработки начала тега. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.7879Аргумент *tag* – это имя тега, приведённое к нижнему регистру. Аргумент *attrs* – это список пар `(name, value)`, содержащий атрибуты, найденные внутри угловых скобок `<>` тега. Имя *name* переводится в нижний регистр, кавычки в значении *value* удалены, а ссылки на символы и сущности заменены. Например, для тега `<A HREF="http://www.cwi.nl/">` этот метод будет вызван как `handle_starttag('a', [('href', 'http://www.cwi.nl/')])`.8081Все ссылки на сущности из [`html.entities`](https://python-all.ru/3.1/library/html.entities.html#module-html.entities) заменяются в значениях атрибутов.8283#### `HTMLParser.handle_startendtag(tag, attrs)`8485Аналогично8687[`handle_starttag()`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser.handle_starttag)8889, но вызывается, когда парсер встречает пустой тег в стиле XHTML (9091`<a .../>`9293). Этот метод может быть переопределён подклассами, которым требуется эта конкретная лексическая информация; реализация по умолчанию просто вызывает9495[`handle_starttag()`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser.handle_starttag)9697и9899[`handle_endtag()`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser.handle_endtag)100101.102103#### `HTMLParser.handle_endtag(tag)`104105Этот метод вызывается для обработки закрывающего тега элемента. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает. Аргумент106107*tag*108109– это имя тега, приведённое к нижнему регистру.110111#### `HTMLParser.handle_data(data)`112113Этот метод вызывается для обработки произвольных данных. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.114115#### `HTMLParser.handle_charref(name)`116117Этот метод вызывается для обработки символьной ссылки вида118119`&#ref;`120121. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.122123#### `HTMLParser.handle_entityref(name)`124125Этот метод вызывается для обработки общей ссылки на сущность вида126127`&name;`128129, где130131*name*132133– это общая ссылка на сущность. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.134135#### `HTMLParser.handle_comment(data)`136137Этот метод вызывается при обнаружении комментария. Аргумент138139*comment*140141– это строка, содержащая текст между разделителями142143`--`144145и146147`--`148149, но не сами разделители. Например, комментарий150151`<!--text-->`152153вызовет этот метод с аргументом154155`'text'`156157. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.158159#### `HTMLParser.handle_decl(decl)`160161Метод, вызываемый, когда парсер считывает объявление SGML162163`doctype`164165. Параметр166167*decl*168169будет содержать полное содержимое объявления внутри разметки170171`<!...>`172173. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.174175#### `HTMLParser.unknown_decl(data)`176177Метод, вызываемый, когда парсер считывает нераспознанное объявление SGML. Параметр178179*data*180181будет содержать полное содержимое объявления внутри разметки182183`<!...>`184185. Иногда полезно переопределить этот метод в производном классе; реализация базового класса вызывает186187[`HTMLParseError`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParseError)188189.190191#### `HTMLParser.handle_pi(data)`192193Метод, вызываемый при обнаружении инструкции обработки. Параметр *data* будет содержать всю инструкцию обработки. Например, для инструкции обработки `<?proc color='red'>` этот метод будет вызван как `handle_pi("proc color='red'")`. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.194195> **Примечание**196>197> Класс [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser) использует синтаксические правила SGML для обработки инструкций. Инструкция обработки XHTML, использующая завершающий `'?'`, приведёт к включению `'?'` в *data*.198199## 19.1.1. Пример приложения для разбора HTML200201В качестве базового примера ниже представлен очень простой парсер HTML, который использует [`HTMLParser`](https://python-all.ru/3.1/library/html.parser.html#html.parser.HTMLParser) класс для вывода тегов по мере их обнаружения:202203```python204>>> from html.parser import HTMLParser205>>>206>>> class MyHTMLParser(HTMLParser):207... def handle_starttag(self, tag, attrs):208... print("Encountered a {} start tag".format(tag))209... def handle_endtag(self, tag):210... print("Encountered a {} end tag".format(tag))211...212>>> page = """<html><h1>Title</h1><p>I'm a paragraph!</p></html>"""213>>>214>>> myparser = MyHTMLParser()215>>> myparser.feed(page)216Encountered a html start tag217Encountered a h1 start tag218Encountered a h1 end tag219Encountered a p start tag220Encountered a p end tag221Encountered a html end tag222```223