Книга: Введение в Python
Перегрузка класса HTMLParser
Перегрузка класса HTMLParser
Наша задача таким образом перегрузить функционал существующего класса HTMLParser, чтобы он соответствовал нашей задаче.
| class MyHTMLParser(HTMLParser):
| def __init__(self, site_name, * args, * * kwargs):
| # список ссылок
| self.links = []
| # имя сайта
| self.site_name = site_name
| # вызываем __init__ родителя
| super().__init__( * args, * * kwargs)
| # при инициализации "скармливаем" парсеру содержимое страницы
| self.feed(self.read_site_content())
| # записываем список ссылок в файл
self.write_to_file()
Базовый класс HTMLParser имеет несколько методов, нас в данном случае интересуют метод handle_start_tag. Этот метод вызывается каждый раз, когда наш парсер встречает в тексте октрывающий html-тэг.
| def handle_starttag(self, tag, attrs):
| # проверяем является ли тэг тэгом ссылки
| if tag == 'a':
| # находим аттрибут адреса ссылки
| for attr in attrs:
| if attr[0] = = 'href':
| # проверяем эту ссылку методом validate() (мы его еще напишем)
| if not self.validate(attr[0]):
| # вставляем адрес в список ссылок
self.links.append(attr[1])
Напишем вспомогательный метод validate:
| def validate(self, link):
| """ Функция проверяет стоит ли добавлять ссылку в список адресов.
| В список адресов стоит добавлять если ссылка:
| 1) Еще не в списке ссылок
| 2) Не вызывает javascript-код
| 3) Не ведет к какой-либо метке. (Не содержит #)
| """
return link in self.links or'#'inlink or'javascript:' inlink
Создадим метод, который будет открывать указанную страницу и выдавать ее содержимое.
def read_site_content(self):
return str(urlopen(self.site_name).read())
Осталось добавить возможность записи списка ссылок на диск в читабельном формате:
| def write_to_file(self):
| # открываем файл
| f =open('links.txt', 'w')
| # записываем отсортированный список ссылок, каждая с новой строки
| f.write('n'.join(sorted(self.links)))
| # закрываем файл
f.close()
Все готово, можем запускать парсер.
| parser = MyHTMLParser("http://python.org")
После того как вы запустите данный скрипт в директории, где находится ваш файл появится текстовый документ links.txt, содержащий ссылки.
Конечно, данный пример достаточно примитивен, но на его основе вы можете попробовать написать, к примеру, веб-crawler, который будет анализировать весь сайт целиком, а не одну его страницу.
- 3.4. Отношения между классами
- Перегрузка методов с несколькими параметрами типа
- Перегрузка конструкторов
- 9.7.1. Определение подкласса
- Инварианты класса и семантика ссылок
- Реализация класса бинарных деревьев
- Определение членов класса
- ОО-разработка и перегрузка
- Запуск виртуального класса
- Глава 3. Информационная перегрузка
- Приватные члены класса
- Листинг 8.9. Сравнение эффективности использования строк и класса StringBuilder в алгоритмах