Класс "Стек" (продолжение, программа "Теги в HTML").


Необходимо обработать HTML-файл:
⇒ class_stack_tags.html

Нужно выяснить совпадает ли количество открывающих тегов "head" с количеством закрывающих "/head".
А также проверить теги "title" и "/title".

Для этого необходимо воспользоваться классом "Стек" из предыдущей программы.

Пример того, как должна работать программа:





import re

"""КЛАСС СТЕК"""
class Stack:
    def __init__(self):
        self.__data = list()                                                                            # для стека выбран список 

    def push(self, item):                                                                               # добавить элемент в очередь
        self.__data.append(item)                                            

    def pop(self):                                                                                      # убрать последний элемент
        if len(self.__data) > 0:                                            
            return self.__data.pop()                                            
        return None                                                                                     # вернуть None, если стек пуст

    def peek(self):                                                                                     # посмотреть вершину стека
        if len(self.__data) > 0:                                            
            return self.__data[-1]                                          
        return None                                                                                     # вернуть None, если стек пуст    

    def is_empty(self):                                                                                 # проверить пуст ли стек
        return len(self.__data) == 0                                                                    

    def size(self):                                                                                     # узнать размер стека
        return len(self.__data)                                     

    def show(self):                                                                                     # вывести стек в stdout    
        print("\nСтек:")
        print("\n".join([str(i) for i in self.__data[::-1]]), "\n")


# входные данные
a = open("./4.37.class_stack_tags.html", "r")                                                           # передаётся файл, в котором будем производить поиск
s = a.read()
my_search_list = [re.compile(r"<head[^<]*>|</head>"), re.compile(r"<title[^<]*>|</title>")]             # задаётся шаблон для поиска

# составим список списков, в каждом подсписке только один тип тегов, к примеру [['<head>', '</head>'], ['<title>', '</title>']]
result = []
for i in my_search_list:
    x = i.findall(s)
    result.append(x)

# основной цикл
finish_text = ""    
for a in result:
    # для head
    temp = Stack()
    for b in a:
        if "<head" in b:
            temp.push(b)
        elif "</head>" in b:
            if temp.size() < 1:
                print("Неудача с </head>.")
                print("Закрывающих тегов </head> больше, чем нужно.")
                finish_text = "Тест не пройден!"
            else:
                temp.pop()
    if temp.size() > 0:
        print("Открывающих тегов <head> больше, чем нужно.")
        temp.show()
        finish_text = "Тест не пройден!"

    # для title
    temp = Stack()
    for b in a:
        if "<title" in b:
            temp.push(b)
        elif "</title>" in b:
            if temp.size() < 1:
                print("Неудача с </title>.")
                print("Закрывающих тегов </title> больше, чем нужно.")
                finish_text = "Тест не пройден!"
            else:
                temp.pop()
    if temp.size() > 0:
        print("Открывающих тегов <title> больше, чем нужно.")
        temp.show()
        finish_text = "Тест не пройден!"

if finish_text:
    print(finish_text)    
else:
    print("Тест пройден!")