До прихода сюда пользовался feed43.com Так как он благополучно издох, решим попробовать.
Для примера помогите с простой задачкой, что бы понять логику.
Беру ссылку без РСС
http://pda.rbc.ru/quotes.shtml
вставляю в DevTools закладка "парсер" нахожу нужный мне блок
в закладке "свойства" он отображается:
nodeName: table
---
xpath: /html/body/div[3]/div[1]/table[1]
---
childNodes.length: 5
и теперь у меня тупик, не могу заставить отображаться в закладке "темплэйт"
Помогите с этим примером, надеюсь дальше сам разберусь.
lfc-su, все просто :)
Ваш случай - создание RSS-ленты без RSS вообще, причем вся нужная информация сосредоточена на одной странице. На этом сайте есть похожие ленты, например:
http://rss-farm.ru/channels/diggi/weather - погода в Москве
Что и как делать:
На вкладке Templates вводим Source Url (http://pda.rbc.ru/quotes.shtml), Channel title (РБК: ключевые индикаторы), Encoding (windows-1251). Снимаем галочку RSS based (http://pda.rbc.ru/quotes.shtml - обычная страница). А в Channel template пишем такое заклинание:
try{
// Что бы было потом проще, выделим XPath в отдельную переменную
var mainXpath = '/html/body/div[3]/div[1]/table[1]';
// Создаем документ, используя нужный адрес
var d = new Document(channel.url, channel.encoding);
// В отдельную переменную получаем те данные, которые нам нужны
var body = d.getElementsByXPath(mainXpath)[0];
// Создаем элемент RSS-ленты, и кладем в него полученные данные
var a = new Article();
a.body = body.outerHTML;
// Созданный элемент ленты кладем, собственно, в ленту
channel.articles.push(a);
}catch(e){
errorMessages.Add(e);
}
Благодарю, за оперативную помощь, уже стараюсь разобраться на существующих примерах.
Вскипел мой разум не смышлённый. Не могу понять принцип выделения нужных новостей на странице...
вот пример, не сложный в feed43(тут для меня тупик):
http://www.liverpoolfc.tv/mediawatch/a_index.shtml
iso-8859-1
в DevTools закладка "парсер" нахожу нужный мне блок
в закладке "свойства" он отображается:
/html/body/p[4]
Но это одна новость, в правой колонке все новости обозначены одинаково
p(7)
<p class="body"> ххххх </p>
пробую:
var links = d.getElementsByAttr('p', 'class', 'body');
но видимо это не для этого случая и вываливается куча ошибок.
В продолжение, полная статья ите по ссылке
/drilldown/a_MW15028090907-1138.shtml
в том же виде
<p class="body"> ххххх </p>
Добавлю по первому вопросу.
канал не обновляется, в (UpLog)
пишет
rbc-ru HALTED
8 сентября 2009 г., 14:41:16 | lfc-su
Article must have an id Parameter name: articleDTO
rbc-ru OK
8 сентября 2009 г., 14:41:14 | lfc-su
Started
> Article must have an id Parameter name: articleDTO
Точно! :) Я совсем забыл. Для каждой статьи нужно задать 2 свойства:
...
a.url = a.id = channel.url + '#'+ DateTime.Now.Date;
// Созданный элемент ленты кладем, собственно, в ленту
channel.articles.push(a);
...
> http://www.liverpoolfc.tv/mediawatch/a_index.shtml
Напишу чуть позже. Я так понимаю, Вам нужно вытащить все материалы, которые расположены по ссылкам на этой странице?
В (UpLog)
всё равно пишет:
rbc-ru HALTED
8 сентября 2009 г. 20:44
Article must have an id
Parameter name: articleDTO
Вот шаблон полностью:
<?xml version="1.0" encoding="utf-8"?><Template type="ScriptUpdater"><Url>http://pda.rbc.ru/quotes.shtml</Url><Title>rbc.ru</Title><Description>КЛЮЧЕВЫЕ ИНДИКАТОРЫ</Description><Encoding>windows-1251</Encoding><UserAgent></UserAgent><ChannelTemplate><![CDATA[try{
// Что бы было потом проще, выделим XPath в отдельную переменную
var mainXpath = '/html/body/div[3]/div[1]/table[1]';
// Создаем документ, используя нужный адрес
var d = new Document(channel.url, channel.encoding);
// В отдельную переменную получаем те данные, которые нам нужны
var body = d.getElementsByXPath(mainXpath)[0];
// Создаем элемент RSS-ленты, и кладем в него полученные данные
var a = new Article();
a.body = body.outerHTML;
a.url = a.id = channel.url + '#'+ DateTime.Now.Date;
// Созданный элемент ленты кладем, собственно, в ленту
channel.articles.push(a);
}catch(e){
errorMessages.Add(e);
}
]]></ChannelTemplate><ArticleTemplate><![CDATA[]]></ArticleTemplate><IsRSSBased>False</IsRSSBased></Template>
> rbc-ru HALTED
Это поправил, подождем обновления.
> liverpoolfc.tv
Попробуйте вот такой шаблон:
Url: http://www.liverpoolfc.tv/mediawatch/a_index.shtml
Encoding: utf-8
IsRSSBased: False
ChannelTemplate:
try{
var d = new Document(channel.url, channel.encoding);
var links = d.getElementsByAttr('p', 'class', 'body');
for (var i=0; i< links.length; i++){
var el = links[i];
var a = new Article();
a.id = el.childNodes[1].getAttribute('href');
a.url = 'http://www.liverpoolfc.tv' + a.id;
a.header = el.childNodes[1].innerText;
a.date = DateTime.Now.Date;
channel.articles.push(a);
}
}catch(e){
errorMessages.Add(e);
}
ArticleTemplate:
try{
var d = new Document(article.url, channel.encoding);
var h1 = d.getElementsByAttr('h1', 'class', 'head synopsis')[0];
var cel = h1.nextSibling;
article.body = '';
while (cel!=null && cel.innerText.indexOf('OTHER HEADLINES') < 0){
article.body += cel.outerHTML;
cel = cel.nextSibling;
}
}catch(e){
errorMessages.Add(e);
}
Всё здорово, это шаблон заработал, на нём сделал три ленты
http://rss-farm.ru/my/channels/lfc-media
http://rss-farm.ru/my/channels/lfc-hn
http://rss-farm.ru/my/channels/lfc-n
то что мне нужно.
единственное НО, перед заголовком вылезает
<!-- START HEADLINE1 --> <!-- END HEADLINE1 -->
что нибудь можно сделать?
Ещё, ссылки внутри новости ссылаются на rss-farm.ru, типа
http://feeds.rss-farm.ru/team/squad/aurelio/a_index.shtml
а хотелось бы, что бы
http://www.liverpoolfc.tv/team/squad/aurelio/a_index.shtml
В заголовках правильные ссылки.
и с рисунками в теле новости та же беда, ссылка не фото
http://feeds.rss-farm.ru/images5/bolton33.jpg
а должна быть
http://www.liverpoolfc.tv/images5/bolton33.jpg
Ссылки можно исправить так:
article.body = article.body.replace(/href="/g, 'href="http://www.liverpoolfc.tv/')
Эту строку нужно пометить в конце ArticleTemplate перед
...
}
}catch(e)....
Картинки и заголовки - аналогично.
в этом случае ссылки начинают выглядеть так
http://www.liverpoolfc.tvhttp//www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tv/team/squad/aurelio/a_index.shtml
В этой строке убрал " и /
article.body = article.body.replace(/href="/g, 'href="http://www.liverpoolfc.tv/')
получилось
article.body = article.body.replace(/href="/g, 'href=http://www.liverpoolfc.tv')
но теперь ссылка выглядит
http://www.liverpoolfc.tv/team/squad/johnson/a_index.shtml%22
то есть добавляется
%22
и не открывается
То есть если оставляю " то ссылка получается
http://www.liverpoolfc.tvhttp//www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tvhttp://www.liverpoolfc.tv/team/squad/johnson/a_index.shtml
а если убираю " то к ссылке добавляется %22 и все равно она не работает
http://www.liverpoolfc.tv/team/squad/johnson/a_index.shtml%22
...упёрся
> http://www.liverpoolfc.tvhttp//www.liverpoolfc.tvhttp://...
:)
Нужно вынести строчку из цикла while, я скопировал лишнюю скобку :)
cel = cel.nextSibling;
}
article.body = article.body.replace(/href="/g, 'href=http://www.liverpoolfc.tv')
}catch(e){
И кавычку оставить.
Так и есть скобку перенёс выше и все ОК
Вот как окончательно выглядит ArticleTemplate:
try{
var d = new Document(article.url, channel.encoding);
var h1 = d.getElementsByAttr('h1', 'class', 'head synopsis')[0];
var cel = h1.nextSibling;
article.body = '';
while (cel!=null && cel.innerText.indexOf('OTHER HEADLINES') < 0){
article.body += cel.outerHTML;
cel = cel.nextSibling;
}
article.body = article.body.replace(/href="/g, 'href="http://www.liverpoolfc.tv')
}catch(e){
errorMessages.Add(e);
}
Теперь хотел бы вернуться:
перед заголовком вылезает
<!-- START HEADLINE1 --> <!-- END HEADLINE1 -->
что нибудь можно сделать?
http://feeds.rss-farm.ru/lfc-su/lfc-media
ChannelTemplate:
...
a.header = el.childNodes[1].innerText;
a.header = a.header.replace('<!-- START HEADLINE2 -->','');
a.header = a.header.replace('<!-- END HEADLINE2 -->','');
a.date = DateTime.Now.Date;
...
Тут засада в том, что первая новость обозначается
<!-- START HEADLINE1 -->
<!-- END HEADLINE1 -->
вторая новость
<!-- START HEADLINE2 -->
<!-- END HEADLINE2 -->
третья
<!-- START HEADLINE3 -->
<!-- END HEADLINE3 -->
вообще закомментированные фразы
<!-- хххххх -->
не видны в ХТМЛках, возможно ли и здесь их спрятать?
Да, просмотрел. Но нет ничего невозможного! :)
a.header = a.header.substring(a.header.lastIndexOf('-->')+3, a.header.length);
Нужно вставить на место предыдущего решения.
не получается удалить каналы на которых экспериментировал:
lfc-media: Liverpool tv
lfc-hn: Liverpool tv
lfc-n: Liverpool tv
Выбрасывает на ошибку
500
500
Хм.. надо разобраться, спасибо за сообщение об ошибке :)
Еще вопрос, это ошибка или так должно быть?
Время какого часового пояса установлено на этом сайте?
У меня сейчас 10:21 утра по Москве.
А вот время создания этого сообщения присваиваемое движком этого сайта
====>>
ошибся, прошу прощения.
> не получается удалить каналы на которых экспериментировал <br/>
Попробуйте теперь, я исправил ошибку.
Были найдены ошибки и я вернул все обратно. Проблема с удалением каналов все еще решается.
lfc-su, попробуйте теперь удалить ненужные каналы.
OK. Три лишних канала удалил.