Pull to refresh

Экспорт избранного Хабра в FB2

Reading time 2 min
Views 9.3K
Ненавижу длинные вступления
И поэтому не буду писать их даже под спойлером.

  • Зачем?
    • Для оффлайнового просмотра на читалках.
  • Моя читалка не поддерживает FB2!
  • Хочу!
    1. Обзаводимся Python 2.7+. Тестировалось на Python 2.7.3.
    2. Ставим библиотеку BeautifulSoup 4. Вкратце варианты:
      • apt-get install python-beautifulsoup4
      • easy_install beautifulsoup4
      • pip install beautifulsoup4
      • Исходники и python setup.py install
    3. Качаем код из репозитория (прямая ссылка на последнюю версию).
    4. Открываем файл habrafav.py и в строке username = ... прописываем свой логин.
    5. python habrafav.py (или просто habrafav.py под Windows)
    6. Ждём. У меня с кэшированными данными экспорт ~150 статей занимает около 6 минут и 600 Мб оперативной памяти.
    7. Забираем habrahabr_favorites.fb2. Мой занимает примерно 62 Мб.


  • Уже было.
    • Знаю. Только
      • PDF нормально отображается не везде;
      • у меня так и не получилось запустить тот код.
  • А комментарии есть?
    • Нет. Есть парсинг, но нет экспорта. Прикрутить несложно, но тогда получаемый файл раздуется ещё раза в два-три.
  • Почему FB2?
  • Преобразование корректное?
    • Не совсем. Валидацию получающиеся файлы не проходят.
    • Результаты валидации моего избранного
      • This element is not expected.
        • <empty-line> — 287 раз
        • <code> — 83 раза
        • <emphasis> — 19 раз
        • <strong> — 7 раз
        • <subtitle> — 5 раз
        • <cite> — 4 раза
        • <a> — 3 раза
        • <image> — 2 раза
        • <sup> — 1 раз
      • Character content other than whitespace is not allowed because the content type is 'element-only'. Тег — <cite>, 245 раз.
      • empty tag. Тег — <td>, 19 раз.
    • Тем не менее, мой Kindle получившийся файл (после конвертации в .mobi) прекрасно отображает.
  • А с неформальной точки зрения?
    • UPD: Fixed. Баг был у меня. Перекачайте версию из репозитория.
      Есть странный баг с исчезанием пробелов вокруг тегов, находящихся внутри текста. То есть HTML-код yet another bicycle превращается в yetanotherbicycle. Вероятно, это баг BeautifulSoup, но, возможно, ошибка где-то у меня.
  • Что-нибудь интересное в реализации?
    • Не особо. Весь парсинг сводится к правильным библиотечным вызовам. После него я выкачиваю все картинки и заменяю теги на <image l:href="#image_id"/>. Затем при помощи небольшого набора костылей перестраиваю деревья разбора. Удаляю одни теги, заменяю другие, вставляю третьи. Наконец, собираю всё это вместе, добавляю шапку, подвал и пишу в файл. Единственный не совсем тривиальный момент — замена тегов <br> на . Грубо говоря - вместо разделителей между параграфами я выделяю сами параграфы. Кому интересно - файл conversion.py, функция make_paragraphs.

    Да этому же прямая дорога на govnokod.ru!
    • Вполне возможно. Я только изучаю возможности BeautifulSoup, поэтому наверняка какие-то вещи сделал не так, как это принято. Напишите в комментариях вашу точку зрения, обсудим.

    Я нашёл ещё баг!

Tags:
Hubs:
+74
Comments 50
Comments Comments 50

Articles