Чтение книг формата .fb2

Решил сделать ридер .fb2 файлов. Разобрав структуру, обнаружил, что там используются теги, по примерно одинаковой системе, и решил распарсивать файл таким образом: прогоняю каждую строку в цикле, если обнаруживаю тег, то добавляю в список все строки после индекса строки с тегом, пока не встретится конец тега. Однако мне это кажется грубым вариантом, который не будет универсален для всех книг. Плюс есть несколько проблем, строка _book.append(line.replace('<p>', '').replace('</p>','\n')) не хочет работать совсем, что странно, ведь эти тег там есть.

Как можно лучше реализовать эту идею без использования каких то готовых библиотек?



class Book:
    def __init__(self, file):
        self.file = file
        self.book = []
        with open(self.file, 'r', encoding='utf-8') as file:
            file = file.readlines()
            _book = []
            for line in file:
                _book.append(line.lstrip())
            for line in file:
                _book.append(line.replace('<p>', '').replace('</p>','\n'))
            for line in _book:
                self.book.append(line.strip('\n'))

    @property
    def get_description(self):
        _description = []
        for line in self.book:
            if line.startswith('<description>'):
                line_index = self.book.index(line)
                for line in self.book[line_index:]:
                    _description.append(line)
                    if line.startswith('</description>'):
                        break

        description = {}
        for line in _description:
            if line.startswith('<book-name>'):
                description['book-title'] = line.lstrip('<book-name>').rstrip('</book-name>')
            elif line.startswith('<book-title>'):
                description['book-title'] = line.lstrip('<book-title>').rstrip('</book-title>')
            elif line.startswith('<author>'):
                a = _description.index(line)
                for i in self.book[a:]:
                    if i.startswith('<first-name>'):
                        description['autor-first-name'] = i.lstrip('<first-name>').rstrip('</first-name>')
                    if i.startswith('<middle-name>'):
                        description['autor-middle-name'] = i.lstrip('<middle-name>').rstrip('</middle-name>')
                    if i.startswith('<last-name>'):
                        description['autor-last-name'] = i.lstrip('<last-name>').rstrip('</last-name>')
                    if i.startswith('</author>'):
                        break
            elif line.startswith('<annotation>'):
                annotation = []
                line_index = self.book.index(line)
                for line in self.book[line_index:]:
                    annotation.append(line)
                    if line.startswith('</annotation>'):
                        break
                description['annotation'] = ''.join(annotation).replace('<empty-line/>', '\n').replace('<annotation>', '').replace('</annotation>', '')

        return description

    def get_chapters_title(self):
        chapters = []
        for index, value in enumerate(self.book):
            if value.startswith('<title>'):
                a = {index : self.book[index+1].lstrip('<p>').rstrip('</p>').lstrip('strong>').rstrip('</strong')}
                chapters.append(a)

        return chapters

Ответы (0 шт):