Ненавижу длинные вступления
И поэтому не буду писать их даже под спойлером.
- Зачем?
- Для оффлайнового просмотра на читалках.
- Моя читалка не подде��живает FB2!
- Хочу!
- Обзаводимся Python 2.7+. Тестировалось на Python 2.7.3.
- Ставим библиотеку BeautifulSoup 4. Вкратце варианты:
apt-get install python-beautifulsoup4easy_install beautifulsoup4pip install beautifulsoup4- Исходники и
python setup.py install
- Качаем код из репозитория (прямая ссылка на последнюю версию).
- Открываем файл
habrafav.pyи в строкеusername = ...прописываем свой логин. python habrafav.py(или простоhabrafav.pyпод Windows)- Ждём. У меня с кэшированными данными экспорт ~150 статей занимает около 6 минут и 600 Мб оперативной памяти.
- Забираем
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, но, возможно, ошибка где-то у меня.
- UPD: Fixed. Баг был у меня. Перекачайте версию из репозитория.
- Что-нибудь интересное в реализации?
- Не особо. Весь парсинг сводится к правильным библиотечным вызовам. После него я выкачиваю все картинки и заменяю теги
на<image l:href="#image_id"/>. Затем при помощи небольшого набора костылей перестраиваю деревья разбора. Удаляю одни теги, заменяю другие, вставляю третьи. Наконец, собираю всё это вместе, добавляю шапку, подвал и пишу в файл. Единственный не совсем тривиальный момент — замена тегов<br>на. Грубо говоря - вместо разделителей между параграфами я выделяю сами параграфы. Кому интересно - файл conversion.py, функцияmake_paragraphs.
Да этому же прямая дорога на govnokod.ru!
- Вполне возможно. Я только изучаю возможности BeautifulSoup, поэтому наверняка какие-то вещи сделал не так, как это принято. Напишите в комментариях вашу точку зрения, обсудим.
Я нашёл ещё баг!
- BitBucket поддерживает форки.
- Не особо. Весь парсинг сводится к правильным библиотечным вызовам. После него я выкачиваю все картинки и заменяю теги
