html.parser.md
1> **Источник:** https://python-all.ru/3.0/library/html.parser.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `html.parser` – простой парсер HTML и XHTML89Этот модуль определяет класс [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser), который служит основой для разбора текстовых файлов в формате HTML (язык гипертекстовой разметки) и XHTML.1011#### `[html.parser.HTMLParser]class html.parser.HTMLParser`1213Класс [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser) создаётся без аргументов.1415Экземпляр [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser) получает HTML-данные и вызывает функции-обработчики при начале и конце тегов. Класс [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser) предназначен для переопределения пользователем, чтобы реализовать нужное поведение.1617Этот парсер не проверяет, соответствуют ли закрывающие теги открывающим, и не вызывает обработчик закрывающего тега для элементов, которые неявно закрываются при закрытии внешнего элемента.1819Также определено исключение:2021#### `[html.parser.HTMLParseError]exception html.parser.HTMLParseError`2223Исключение, вызываемое классом2425[`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser)2627при возникновении ошибки во время разбора. Это исключение предоставляет три атрибута:2829`msg`3031– краткое сообщение с описанием ошибки,3233`lineno`3435– номер строки, на которой была обнаружена ошибочная конструкция, и3637`offset`3839– количество символов от начала строки до начала конструкции.4041Экземпляры [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser) имеют следующие методы:4243#### `[html.parser.HTMLParser.reset]HTMLParser.reset()`4445Сбрасывает экземпляр. Теряет все необработанные данные. Вызывается неявно при создании экземпляра.4647#### `[html.parser.HTMLParser.feed]HTMLParser.feed(data)`4849Передаёт парсеру некоторый текст. Текст обрабатывается по мере поступления полных элементов; неполные данные буферизуются до тех пор, пока не будут переданы новые данные или не будет вызван5051[`close()`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser.close)5253.5455#### `[html.parser.HTMLParser.close]HTMLParser.close()`5657Принудительно обрабатывает все буферизованные данные так, как если бы за ними следовал маркер конца файла. Этот метод может быть переопределён в производном классе для добавления обработки в конце входных данных, но переопределённая версия всегда должна вызывать метод базового класса5859[`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser)6061–6263[`close()`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser.close)6465.6667#### `[html.parser.HTMLParser.getpos]HTMLParser.getpos()`6869Возвращает номер текущей строки и смещение.7071#### `[html.parser.HTMLParser.get_starttag_text]HTMLParser.get_starttag_text()`7273Возвращает текст самого последнего открытого начального тега. Обычно это не требуется для структурированной обработки, но может пригодиться при работе с HTML «как есть» или при повторной генерации входных данных с минимальными изменениями (пробелы между атрибутами можно сохранить и т.д.).7475#### `[html.parser.HTMLParser.handle_starttag]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.0/library/html.entities.html#module-html.entities) заменяются в значениях атрибутов.8283#### `[html.parser.HTMLParser.handle_startendtag]HTMLParser.handle_startendtag(tag, attrs)`8485Аналогично8687[`handle_starttag()`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser.handle_starttag)8889, но вызывается, когда парсер встречает пустой тег в стиле XHTML (9091`<a .../>`9293). Этот метод может быть переопределён подклассами, которым требуется эта конкретная лексическая информация; реализация по умолчанию просто вызывает9495[`handle_starttag()`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser.handle_starttag)9697и9899[`handle_endtag()`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser.handle_endtag)100101.102103#### `[html.parser.HTMLParser.handle_endtag]HTMLParser.handle_endtag(tag)`104105Этот метод вызывается для обработки закрывающего тега элемента. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает. Аргумент106107*tag*108109– это имя тега, приведённое к нижнему регистру.110111#### `[html.parser.HTMLParser.handle_data]HTMLParser.handle_data(data)`112113Этот метод вызывается для обработки произвольных данных. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.114115#### `[html.parser.HTMLParser.handle_charref]HTMLParser.handle_charref(name)`116117Этот метод вызывается для обработки символьной ссылки вида118119`&#ref;`120121. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.122123#### `[html.parser.HTMLParser.handle_entityref]HTMLParser.handle_entityref(name)`124125Этот метод вызывается для обработки общей ссылки на сущность вида126127`&name;`128129, где130131*name*132133– это общая ссылка на сущность. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.134135#### `[html.parser.HTMLParser.handle_comment]HTMLParser.handle_comment(data)`136137Этот метод вызывается при обнаружении комментария. Аргумент138139*comment*140141– это строка, содержащая текст между разделителями142143`--`144145и146147`--`148149, но не сами разделители. Например, комментарий150151`<!--text-->`152153вызовет этот метод с аргументом154155`'text'`156157. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.158159#### `[html.parser.HTMLParser.handle_decl]HTMLParser.handle_decl(decl)`160161Метод, вызываемый, когда парсер читает SGML-объявление. Параметр162163*decl*164165содержит полное содержимое объявления внутри разметки166167`<!`168169...170171`>`172173. Этот метод предназначен для переопределения в производном классе; реализация базового класса ничего не делает.174175#### `[html.parser.HTMLParser.handle_pi]HTMLParser.handle_pi(data)`176177Метод, вызываемый при обнаружении инструкции обработки. Параметр *data* будет содержать всю инструкцию обработки. Например, для инструкции обработки `<?proc color='red'>` этот метод будет вызван как `handle_pi("proc color='red'")`. Предназначен для переопределения в производном классе; реализация базового класса ничего не делает.178179> **Примечание**180>181> Класс [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser) использует синтаксические правила SGML для обработки инструкций. Инструкция обработки XHTML, использующая завершающий `'?'`, приведёт к включению `'?'` в *data*.182183## Пример приложения парсера HTML184185В качестве базового примера ниже представлен очень простой парсер HTML, который использует [`HTMLParser`](https://python-all.ru/3.0/library/html.parser.html#html.parser.HTMLParser) класс для вывода тегов по мере их обнаружения:186187```python188from html.parser import HTMLParser189190class MyHTMLParser(HTMLParser):191192 def handle_starttag(self, tag, attrs):193 print "Encountered the beginning of a %s tag" % tag194195 def handle_endtag(self, tag):196 print "Encountered the end of a %s tag" % tag197```198