Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Bamse Новенький участник форума
Зарегистрирован: 03.02.2005 Сообщения: 97
|
Добавлено: Пт Фев 04, 2005 10:55 Заголовок сообщения: Обработка FictionBook на Perl |
|
|
Ахтунг! Если у Вас мало времени, просто прочтите фразу, выделеную жирным.
Хочу написать простую программу сортировки FB2 по папкам.
Наткнулся на проблему, что Book2Shelf на некоторые файлы говорит, что-то типа того, что этот файл похож на fb2, но элемент body не найден.... Нет, я понимаю, что это плохо. Но я не хотел бы терять такие файлы. Да и сама B2Shelf мне не особо нужна... Главное, чтобы файлы в папках на месте были, чтобы я просто их себе на MStick копировал.
В общем, наткнулся на проблему. Не понимаю я как работают все эти XML Парсеры... Даже уже в PHP ткнулся... Не врубаюсь..
Кто-нибудь добрый может привести Perl функцию, которая выдергивает из fb2 файла имя, фамилию автора и название книги и кладет их в три переменных? Желательно с использованием стандартных модулей ActivePerl.
После окончания скрипта, обязуюсь его выложить. |
|
Вернуться к началу |
|
|
Shaman Администратор библиотеки FictionBook.Lib
Зарегистрирован: 04.10.2004 Сообщения: 781 Откуда: Россия, Санкт-Петербург
|
Добавлено: Пт Фев 04, 2005 11:04 Заголовок сообщения: |
|
|
Bamse писал(а): | Наткнулся на проблему, что Book2Shelf на некоторые файлы говорит, что-то типа того, что этот файл похож на fb2, но элемент body не найден.... |
По поводу Book2Shelf вел переписку с автором этой проги. Дело оказалось в том, что прога лопатит не весь xml файл, а только первые байты. И ежели не находит в них тега body, то ругается. Лечится все так: в ветке реестра HKEY_USERS\S-1-5-21-436374069-789336058-839522115-1298\Software\Alex Shabarshov\Book2Shelf\Settings
есть параметр FastPrefetchBufferSize, который как раз отвечает за размер читаемого блока от книги. Этот параметр можно изменить. У меня стоит 0х2000 (8192 десятичное). |
|
Вернуться к началу |
|
|
Bamse Новенький участник форума
Зарегистрирован: 03.02.2005 Сообщения: 97
|
Добавлено: Пт Фев 04, 2005 11:21 Заголовок сообщения: |
|
|
2Shaman
Хм. Спасибо! Сейчас попробую.
Но вопрос открыт... Из принципа уже
Хочется простой скрипт, да и разобраться хочется.
--
Ага работает. Еще раз, спасибо. |
|
Вернуться к началу |
|
|
Shaman Администратор библиотеки FictionBook.Lib
Зарегистрирован: 04.10.2004 Сообщения: 781 Откуда: Россия, Санкт-Петербург
|
Добавлено: Пт Фев 04, 2005 12:14 Заголовок сообщения: |
|
|
Да не за что. |
|
Вернуться к началу |
|
|
Bamse Новенький участник форума
Зарегистрирован: 03.02.2005 Сообщения: 97
|
Добавлено: Сб Фев 05, 2005 16:14 Заголовок сообщения: |
|
|
Проблему я решил (вернее, мне помогли). Скоро выложу сортировщик.
Если кто-то может предоставить надежное место, буду очень благодарен (там, если килобайт наберется, то хорошо).
Добавлено спустя 1 час 52 минуты 3 секунды:
Хех... Туплю...
Я просто сюда код выложу, да и все. |
|
Вернуться к началу |
|
|
Admin Администратор информационного портала FB
Зарегистрирован: 11.06.2004 Сообщения: 1610 Откуда: Воронеж
|
Добавлено: Пн Фев 07, 2005 9:02 Заголовок сообщения: |
|
|
Безсайтовым программистам (впрочем и сайтовым) предлагаю размещать файлы, относящиеся к FB на сайте. Присылайте мылом. |
|
Вернуться к началу |
|
|
GribUser Автор формата FB2 - Автор библиотеки FB
Зарегистрирован: 30.09.2004 Сообщения: 2475 Откуда: Москва
|
Добавлено: Пн Фев 07, 2005 13:15 Заголовок сообщения: |
|
|
Цитата: | Кто-нибудь добрый может привести Perl функцию, которая выдергивает из fb2 файла имя, фамилию автора и название книги |
Ну раз никто ничего не пишет... Хватит и названия, полагаю, дальше сами догадаетесь:
Код: | my $parser = XML::LibXML->new();
my $MsgDoc=$parser->parse_file($MesFN);
my $Title=$MsgDoc->findnodes("//description/title-info/book-title")->string_value(); |
|
|
Вернуться к началу |
|
|
Bamse Новенький участник форума
Зарегистрирован: 03.02.2005 Сообщения: 97
|
Добавлено: Пн Фев 07, 2005 14:16 Заголовок сообщения: |
|
|
2GribUser
Да, это я тебе писал.
Но, честно говоря в ООП я не силен.... Вот купил книжку -- читаю
Почему у меня не работает такой код? Код: | use XML::LibXML;
my $parser = XML::LibXML->new();
my $MsgDoc=$parser->parse_file($ARGV[0]);
my $Title=$MsgDoc->findnodes("//description/title-info/book-title")->string_value();
print $Title; |
Я что-то не так понимаю?
Вообще, такой скрипт тоже не очень хорош.... Потому что использует XML::LibXML, которого даже в хранилице activestate нету... Я пока его нашел и установил запарился... Всякие там либы дополнительные...
Сейчас пытаюсь решить проблему через RegExp, но мешают файлы с ошибочной кодировкой... Здесь уже писали про файлы наполненые вместо букв метасимволами html...
Надо их как-то перекодировать...
Еще смотрю стандартный Парсер... Пытаюсь разобраться. |
|
Вернуться к началу |
|
|
GribUser Автор формата FB2 - Автор библиотеки FB
Зарегистрирован: 30.09.2004 Сообщения: 2475 Откуда: Москва
|
Добавлено: Пн Фев 07, 2005 19:01 Заголовок сообщения: |
|
|
Хм... Это, вобще-то, из другой оперы кусок взял я, может там надо еще с неймспейсами что-то шаманить. Хотя должно работать.
Добавлено спустя 14 часов 25 минут 24 секунды:
ps. Посмотри еще на http://www.gribuser.ru/xml/fictionbook/2.0/software/cleanup_book.zip
Там парсер стандартный юзается. |
|
Вернуться к началу |
|
|
unclesam Новенький участник форума
Зарегистрирован: 11.10.2004 Сообщения: 15 Откуда: Минск, Беларусь
|
Добавлено: Вт Фев 15, 2005 16:56 Заголовок сообщения: |
|
|
Сегодня 3 часа убил на разборки с LibXML:
Вот это работает - Код: | $MsgDoc->findnodes(q|//*[name()='description']/*[name()='title-info']/*[name()='book-title']|); |
А вот это нет - Код: | $MsgDoc->findnodes(q|//description/title-info/book-title|) |
Почему - непонятно.
Дурдом....
Смутные подозрения на комбинацию Виндовс - LibXML - UTF-8 |
|
Вернуться к началу |
|
|
Gremlin Зрелый участник форума
Зарегистрирован: 14.02.2005 Сообщения: 155
|
Добавлено: Вт Фев 15, 2005 17:24 Заголовок сообщения: |
|
|
unclesam писал(а): | Сегодня 3 часа убил на разборки с LibXML:
Вот это работает - Код: | $MsgDoc->findnodes(q|//*[name()='description']/*[name()='title-info']/*[name()='book-title']|); |
А вот это нет - Код: | $MsgDoc->findnodes(q|//description/title-info/book-title|) |
Почему - непонятно.
Дурдом....
Смутные подозрения на комбинацию Виндовс - LibXML - UTF-8 |
Было подобное под Linux - LibXML - cp1251.
Больше похоже на заморочки с namespace. Когда столкнулся, то получив что-то вроде первого варианта дальше копать не стал.
По уму надо понять, как задать namespace и вызывать с его указанием (например /fb:description/fb:title-info/fb:book-title) |
|
Вернуться к началу |
|
|
unclesam Новенький участник форума
Зарегистрирован: 11.10.2004 Сообщения: 15 Откуда: Минск, Беларусь
|
Добавлено: Вт Фев 15, 2005 18:02 Заголовок сообщения: |
|
|
Gremlin писал(а): |
Было подобное под Linux - LibXML - cp1251.
Больше похоже на заморочки с namespace. Когда столкнулся, то получив что-то вроде первого варианта дальше копать не стал.
По уму надо понять, как задать namespace и вызывать с его указанием (например /fb:description/fb:title-info/fb:book-title) |
Gremlin, my respects.
Работает, если сделать вот так -
Код: | $MsgDoc->documentElement()->setNamespace("http://www.gribuser.ru/xml/fictionbook/2.0", "fb" , 1);
my @parts = $MsgDoc->findnodes(q|//fb:description/fb:title-info/fb:book-title|);
|
|
|
Вернуться к началу |
|
|
|