Каналы для сайтов без RSS
Вы уже в курсе, как создавать полные версии RSS-лент на базе неполных? Теперь усложним задачу и создадим RSS-ленту для сайта, у которого вообще нет RSS-лент.
Идея
Любая полнотекстовая лента на RSS-farm формируется в 2 этапа. Сначала собирается множество ссылок (и дополнительной информации, вроде даты публикации, автора и т.д., но ссылки — самое важное), на основе которых будут созданы статьи (Articles). Затем, на основе ссылок, создаются статьи и собираются тексты статей.
В случае, когда канал базируется на неполной RSS-ленте, первый этап происходит автоматически. RSS-farm автоматически разбирает неполную RSS-ленту и извлекает из нее информацию о будущих статьях: ссылка на страницу со статьей, дату публикации, вложения и прочее. Вам в вашем шаблоне остается только указать, где на странице находится недостающий текст RSS-ленты.
Когда же RSS-ленты нет, первый этап нужно проделать самостоятельно. Как это сделать?
Пример
В Сети есть множество замечательных сайтов, которые не поставляют RSS вообще. Один из них — «Интернет против телеэкрана». Для него мы и сделаем настоящую RSS-ленту.
Для начала, нам нужно собрать множество ссылок на страницы, с которых мы будем собирать информацию. Открывает DevTools, переходим на вкладку «Parser», водим Url «http://www.contr-tv.ru/» и смотрим на дерево элементов. Нам нужно понять, как собрать ссылки на новости.
Изучив структуру документа, можно собрать эти ссылки, например, так:
try{
var d = new Document(channel.url, channel.encoding);
// Массив с заголовками и ссылками на новости
var links = d.getElementsByAttr('div', 'class', 'newTitle');
// Массив с датами
var dates = d.getElementsByAttr('div', 'class', 'newDate');
for(var i=0; i< links.length; i++){
var cUrl = links[i].getElementsByTagName('a')[0].getAttribute('href');
var cTitle = links[i].getElementsByTagName('a')[0].innerText;
// Приведем дату к формату ДД.ММ.ГГГГ
var cDate = dates[i].innerText.replace('/','.') + '.' + DateTime.Now.Year;
var a = new Article();
a.id = a.url = 'http://www.contr-tv.ru' + cUrl;
a.header = cTitle;
a.date = DateTime.Parse(cDate);
// Помещаем новую статью в канал
// Текст новости получим чуть позже
channel.articles.push(a);
}
}catch(ex){errorMessages.Add(ex)}
Внимание! Очень важно заполнить поле даты новости (article.date). Без даты и новость — не новость, и канал работать не будет.
Этот код нужно поместить в секцию Channel Template и посмотреть, что из этого получится. А получится вот что:
Таким образом, у нас как будто появилась неполная RSS-лента.
Теперь можно плавно переходить ко второму этапу: нужно пройтись по ссылкам и вытащить текст новости. Делаем это в секции Article Template — код из этой секции будет вызван для каждой статьи, созданной в ChannelTemplate.
try{
var d = new Document(article.url,channel.encoding);
var el = d.getElementsByAttr("div", "class" , "articleText")[0];
article.body = el.innerHTML;
}catch(ex){errorMessages.Add(ex)}
Запускаем шаблон, наслаждаемся!