Чтение книг формата .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