картинку из файла fb2

Как получить картинку из файла fb2?

Привет всем! Я очень люблю читать, в связи с чем у меня на сервере достаточно серьезная библиотека собралась. И понятное дело — где много материалов — много бардака. С наведением порядка в библиотеке разберемся чуть позднее (когда-то дойдут руки, и я допишу программку (дописал 🙂 ), которая будет переименовывать ваши файлы на домашнем компьютере из текущего «arkadij_natanovich_strugatckij-ponedelnik-61f44c8d99b2b.fb2.zip» (а именно в таким виде чаще всего файлы и качаются из Интернета) в нечто вроде «Стругацкие.Понедельник начинается в субботу.fb2» — что всяко лучше и нагляднее первого варианта. Но сегодня — как получить картинку из файла fb2?

Тема поста всплыла очень случайно — в одной книге встретилась замечательная таблица со статистическими данными, а так как переписывать их вручную много и скучно — возникла идея написать выдиратор картинок из fb2.

Не буду рассусоливать (и так слишком много воды в тексте сегодня) — скажу только, что так как формат .fb2 сродни .xml — то и парсить его можно с помощью xml.dom.minidom (подробнее — немного позже). Т.е. логика простая:
1. Мы знаем, что все данные из файла .fb2 можно спарсить на основании того, что этот формат — схож с .xml
2. Все картинки в .fb2 хранятся в самом конце, окружены тегами blablabla
3. А после прочтения документации к формату .fb2 и узнав, что картинки хранятся в кодировке base64
приходим к следующему алгоритму действий:
1. Получаем название книги
2. Открываем ее, и парсим содержимое до тех пор, пока не найдем все, что хранится внутри тегов
3. Получаем это самое содержимое, и декодируем из формата base64 в двоичный вид, а после — в графический файл.
4. Сохраняем файл и радуемся.

Сам код:

import xml.dom.minidom
import base64
file = str(input('Введите название книги (в полном виде)\n: '))
doc = xml.dom.minidom.parse(file)
pictures_links = doc.getElementsByTagName('binary')
minimal = 0
for pictures_link in pictures_links:
nodes = pictures_link.childNodes
for node in nodes:
if node.nodeType == node.TEXT_NODE:
base64_pictures_bytes = node.data.encode('utf-8')
pictures_name = str('pictures') + str(minimal) + str('.png')
with open(pictures_name, 'wb') as file_to_save:
decoded_image_data = base64.decodebytes(base64_pictures_bytes)
file_to_save.write(decoded_image_data)
minimal = int(minimal)
minimal = minimal + 1

Пояснять тут что-то будет лишним.
Надеюсь, код пригодится 🙂 Как всегда — в случае возникновения вопросов пишите на почту или в Telegram.
И да — в самое ближайшее время сделаю приложение под Windows, которое будет делать тоже самое (получать картинку из файла fb2), но с помощью более привычного оконного интерфейса, а не терминала 🙂 Обещаю не затягивать!

UPD: программку, как и обещал — сделал. Три кнопки, и никакой мороки! Качать можно либо с моего сайта, либо — из моего Телеграм-канала 🙂

Поисковые запросы:
Как получить картинку из файла fb2
Как извлечь фото и картинки из книги формата FB2

Support the Blog!

Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️

PayPal Logo Donate via PayPal

Revolut Logo Donate via Revolut