Книга: Введение в 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, который будет анализировать весь сайт целиком, а не одну его страницу.


Оглавление книги


Генерация: 1.271. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз