Именно функция urlopen будет получать исходный код указанной странички.
Наша задача таким образом перегрузить функционал существующего класса 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, который будет анализировать весь сайт целиком, а не одну его страницу.
Примитивный Paint на Python
В данной статье мы напишем простенькую рисовалку на Python. На этом примере мы потренируемся в создании GUI, использовании макетов компоновки в tkinter, передаче дополнительных аргументов в функцию-обработчик нажатия кнопки и использовании lambda-функции в Python.
Для этого примера удобнее будет использовать классовый подход к созданию GUI. Для начала определим класс Paint:
>| from tkinter import *
>| class Paint(Frame):
>| def __init__(self, parent):
>| Frame.__init__(self, parent)
>| self.parent = parent
>| def main():
>| root = Tk()
>| root.geometry("1920x1080+300+300")