- Модуль html.parser на Python
- Создание подкласса
- Python html.parse module
- Переопределение методов
- Анализ именованных и числовых ссылок
- Анализ недействительного HTML
- Облегчаем себе жизнь с помощью BeautifulSoup4
- Начало
- Практика
- Парсинг на Python с Beautiful Soup
- Установка библиотек для парсинга
- Поиск сайта для скрапинга
Модуль html.parser на Python
Модуль html.parser в Python предоставляет нам класс HTMLParser, который можно разделить на подклассы для анализа текстовых файлов в формате HTML. Мы можем легко изменить логику для обработки HTML из HTTP-запроса, а также с помощью HTTP-клиента.
Определение класса для HTMLParser выглядит так:
class html.parser.HTMLParser(*, convert_charrefs=True)
В этом уроке мы разберем класс HTMLParser на подклассы, чтобы наблюдать за поведением его функций и работать с ним.
Как мы видели в определении класса HTMLParser, когда значение convert_charrefs равно True, все ссылки на символы (кроме тех, которые содержатся в элементах скрипта и стиля) преобразуются в соответствующие символы Unicode.
Методы обработчика этого класса вызываются автоматически, как только экземпляр класса встречает начальные теги, конечные теги, текст, комментарии и другие элементы разметки в переданной ему строке HTML.
Когда мы хотим использовать этот класс, мы должны подклассифицировать его, чтобы обеспечить нашу собственную функциональность. Прежде чем мы представим пример того же самого, позвольте нам также упомянуть все функции класса, которые доступны для настройки. Вот они:
- handle_startendtag: эта функция управляет как начальным, так и конечным тегами HTML-документа при обнаружении путем передачи управления другим функциям, что ясно из ее определения:
def handle_startendtag(self, tag, attrs): self.handle_starttag(tag, attrs) self.handle_endtag(tag)
def handle_starttag(self, tag, attrs): pass
def handle_endtag(self, tag): pass
- handle_charref: эта функция обрабатывает ссылки на символы в переданной ей String, ее определение дается как:
def handle_charref(self, name): pass
def handle_entityref(self, name): pass
- handle_dataе: эта функция управляет данными в строке HTML и является одной из наиболее важных функций в этом классе, ее определение дается как:
def handle_data(self, data): pass
def handle_comment(self, data): pass
def handle_pi(self, data): pass
def handle_decl(self, decl): pass
Давайте начнем с предоставления подкласса HTMLParser, чтобы увидеть некоторые из этих функций в действии.
Создание подкласса
В этом примере мы создадим подкласс HTMLParser и посмотрим, как вызываются наиболее распространенные методы-обработчики для этого класса. Вот пример программы, которая является подклассом класса HTMLParser:
from html.parser import HTMLParser class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): print("Found a start tag:", tag) def handle_endtag(self, tag): print("Found an end tag :", tag) def handle_data(self, data): print("Found some data :", data) parser = MyHTMLParser() parser.feed('' 'Python html.parse module
')
Посмотрим на результат этой программы:
Три функции-обработчика, которые мы показали выше, являются функциями, которые доступны для настройки из класса. Но это не единственные функции, которые можно игнорировать. В следующем примере мы рассмотрим все переопределяемые функции.
Переопределение методов
В этом примере мы переопределим все функции класса HTMLParser. Посмотрим на фрагмент кода класса:
from html.parser import HTMLParser from html.entities import name2codepoint class JDParser(HTMLParser): def handle_starttag(self, tag, attrs): print("Start tag:", tag) for attr in attrs: print(" attr:", attr) def handle_endtag(self, tag): print("End tag :", tag) def handle_data(self, data): print("Data :", data) def handle_comment(self, data): print("Comment :", data) def handle_entityref(self, name): c = chr(name2codepoint[name]) print("Named ent:", c) def handle_charref(self, name): if name.startswith('x'): c = chr(int(name[1:], 16)) else: c = chr(int(name)) print("Num ent :", c) def handle_decl(self, data): print("Decl :", data) parser = JDParser()
Теперь мы будем использовать этот класс для анализа различных частей скрипта HTML. Вот начало с doctype String:
Посмотрим на результат этой программы:
Давайте посмотрим на фрагмент кода, который передает тег img:
parser.feed(' ')
Посмотрим на результат этой программы:
Обратите внимание, как тег был сломан, и атрибуты для тега также были извлечены.
Давайте также попробуем теги script и style, элементы которых не анализируются:
parser.feed('') parser.feed('#python ')
Посмотрим на результат этой программы:
С этим экземпляром также возможен синтаксический анализ комментариев:
parser.feed('' '