Узнал недавно, что оказывается сервер ЖЖ позволяет отображать комментарии не только в «деревянном» виде, т.е. в виде дерева, но еще и в плоском, когда комментарии располагаются в виде списка один за другим. Причем располагаются они в порядке добавления. Для этого надо передать методом GET параметр view со значением flat. Или, говоря для не программистов, достаточно в адрес добавить ?view=flat (или &view=flat, если какие-то параметры до этого уже были). Мне показалось, что вместе с параметром format=light, который позволяет отображать страницы в стиле Lynx независимо от настроек журнала, параметр view=flat мог бы помочь улучшить движок LJWatcher’а. Тем более, что из плоского вида для каждого комментария можно вытащить идентификатор его родителя, после чего восстановить дерево было бы делом 10-15 строк.
Обрадовавшись, решил попробовать эту идею на Питоне. Заодно выковыривать всю нужную информацию из страницы стал с помощью регулярных выражений, в то время как в LJWatcher’е я сначала преобразовывал HTML в XHTML, а потом получал нужные элементы через XPath. Поэтому иногда были ошибки, если в посте или в комментариях был неправильный HTML.
Результат получился впечатляющим. Посты с большим количеством комментариев стали загружаться в несколько раз быстрее. Что, в общем-то, не удивительно. В LJWatcher’е, чтобы развернуть комментарии, приходилось рекурсивно загружать каждую ветку, а с параметром view=flat такой проблемы нет в принципе.
Уже начал подумывать о том, чтобы или в LJWatcher’е переделать движок таким образом, или довести скрипт на Питоне до ума и сделать следующую версию проги на нем, заодно сделать ее кроссплатформенной. Окзалось, что радовался я рано. Осталась одна малюююсенькая проблема, которая и в LJWatcher’е попортила не мало крови, но там ее удалось все-таки обойти. Эта проблема — удаленные комментарии, на которые кто-то ответил. При использовании параметра view=flat удаленные комментарии не отображаются, что в общем-то логично с точки зрения пользователя. И, таким образом, при использовании этого параметра нельзя получить их идентификаторы (и, что самое обидное, идентификаторы их родителей). Поэтому, если есть несколько удаленных комментариев, идущих в качестве ответа друг на друга, а затем за последним удаленным комментарием идет комментарий полноценный, то при построении дерева из комментариев, полученных в плоском виде, теряется вложенность.
Есть мысля дополнительно загружать обычный вид (разумеется, с параметром format=light) только для того, чтобы получить идентификаторы удаленных комментариев и их родителей, но боюсь, что тогда опять пойдут пляски с бубном, которые были в LJWatcher’е (особено, чтобы получить идентификаторы родителей, потому что повыколупливать идентификаторы самих удаленных комментариев — не проблема).
Надо будет еще поковыряться, может что и получится интересного. Но все-таки жалко, что в справке к серверу ЖЖ нет функций для получения комментариев без разбора HTML’а.
PS: Пока рылся в гугле узнал про еще один параметр fallback=s2, чтобы отображать страницу в стиле s2 тоже независимо от настроек журнала. Не знаю кому это может понадобиться, имхо, format=light парсить легче. Ну это так, к сведению, может кому-нибудь и пригодится.