4 | except ValueError:
5 | print ("Это не число")
6 | except ZeroDivisionError:
7 | print ("На ноль делить нельзя")
Кроме того мы можем добавить пустой блок except, который будет срабатывать на непредвиденную выше ошибку. Пустой блок except всегда должен идти последним:
1 | try:
2 | a =float(input ("Введите число: ")
3 | print (100 / a)
4 | except ValueError:
5 | print ("Это не число")
6 | except ZeroDivisionError:
7 | print ("На ноль делить нельзя")
8 | except:
9 | print ("Неожиданная ошибка.")
Блоку except можно добавить необязательный блок else, который сработает в случае, если программа выполнилась без ошибок:
1 | try:
2 | a =float(input ("Введите число: ")
3 | print (100 / a)
4 | except ValueError:
5 | print ("Это не число")
6 | except ZeroDivisionError:
7 | print ("На ноль делить нельзя")
8 | except:
9 | print ("Неожиданная ошибка.")
10 | else:
11 | print ("Код выполнился без ошибок")
В результате, мы получим следующее.
Также у блока except есть еще один необязательный блок finally, который сработает независимо от того, выполнился код с ошибками или без:
1 | try:
2 | a =float(input ("Введите число: ")
3 | print (100 / a)
4 | except ValueError:
5 | print ("Это не число")
6 | except ZeroDivisionError:
7 | print ("На ноль делить нельзя")
8 | except:
9 | print ("Неожиданная ошибка.")
10 | else:
11 | print ("Код выполнился без ошибок")
12 | finally:
13 | print ("Я выполняюсь в любом случае!")
Таким образом, используя обработку исключительных ситуаций, вы можете защитить программу от взлома, непредвиденного поведения и в будущем получить детальную информацию по логическим ошибкам, содержащимся в ней.
HTML парсер на Python
Published: 08 April 2015
Учитывая современное развитие Интернета, было бы кощунством не написать приложение, взаимодействующее со всемирной паутиной. Сегодня мы напишем простенький html-парсер на Python. Наше приложение будет читать код указанной страницы сайта и сохранять все ссылки в ней в отдельный файл. Это приложение может помочь SEO-аналитикам и веб-разработчикам.
Писать будем на Python 3, в котором есть встроенный класс для html-парсера из модуля html.parser
| from html.parser import HTMLParser
Так же нам понадобится функция urlopen из модуля urllib
| from urllib.request import urlopen
Именно функция 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())