Denis Gladkikh

outcoldman

My personal blog about software development

  • 22 Sep 2009
  • XML, HTML2RSS, LiveJournal, Masterhost, Microsoft MVC, RSS, XPATH
  • 0 comments

Зарегистрировался на livejournal.com я давно, а вот начал пользоваться недавно. К набору друзей я отношусь трепетно, так как я, действительно, читаю френд ленту, сам не ищу новых интересных блоггеров (кстати, может подскажите, кого стоит добавить во френд ленту?), но бывает добавляю на кого напорюсь случайно или кто меня добавит. Так вот, что мне не нравится, так это то, что нет rss своей френд ленты. Порывшись по интернету, я нашел кучу способов преобразования html в rss (есть вариант где чуть ли не ИИ исследовал страницу и находил как верно ее экспортировать в rss), но по настоящему мне ни один способ не подошел – в итоге все равно что-то не работало. Тут у меня и родилась идея создать собственный конвертер из html в rss. Опять таки, порывшись и погуглив я набрел на решение Html Agility Pack (еще смотрел Data Extracting SDK, но вроде функциональность не та, да и пару необоснованных NullReferenceException сделали свое дело). Если скачать Html Agility Pack – то там даже пример есть как при помощи него сделать rss из html, у меня как раз и была идея: либо разбирать с возможностью настройки на RegEx, либо на XPath (в случае данной библиотеки - это XPath). Правда, HtmlAgilityPack мне тоже пришлось поправить немного, не знаю с чем это связано, но там мне мешал метод MoveToRoot у HtmlNodeNavigator – он вызывался не в совсем нужный момент и мешал мне в разборе (я просто закомментировал его функциональность).

В итоге код, который создавал rss по html для моей френд ленты выглядел так: 

HtmlDocument doc = new HtmlDocument(); 
doc.Load(MapPath("~/sample.htm"), Encoding.UTF8); 
 
HtmlNodeCollection entries = doc.DocumentNode.SelectNodes("//div[@class='hentry']"); 
 
XmlDocument rssDoc = new XmlDocument(); 
rssDoc.LoadXml("<?xml version=\"1.0\" encoding=\"" + doc.Encoding.BodyName + "\"?><rss version=\"0.91\"/>"); 
 
XmlElement channel = rssDoc.CreateElement("channel"); 
rssDoc.FirstChild.NextSibling.AppendChild(channel); 
 
XmlElement temp = rssDoc.CreateElement("title"); 
temp.InnerText = "ASP.Net articles scrap RSS feed"; 
channel.AppendChild(temp); 
 
temp = rssDoc.CreateElement("link"); 
temp.InnerText = "http://outcoldman.livejournal.com"; 
channel.AppendChild(temp); 
 
foreach (HtmlNode entry in entries) 
{ 
    XmlElement item; 
 
    HtmlNode href = entry.SelectSingleNode("//a[@href and @rel='bookmark']"); 
    // get what's interesting for RSS 
    string link = href.Attributes["href"].Value; 
    string title = href.InnerText; 
 
    HtmlNode date = entry.SelectSingleNode("//abbr[@title and @class='updated']"); 
 
    // create XML elements 
    item = rssDoc.CreateElement("item"); 
    channel.AppendChild(item); 
 
    temp = rssDoc.CreateElement("date"); 
    temp.InnerText = date.Attributes["title"].Value; 
    item.AppendChild(temp); 
    
    temp = rssDoc.CreateElement("title"); 
    temp.InnerText = title; 
    item.AppendChild(temp); 
 
    temp = rssDoc.CreateElement("link"); 
    temp.InnerText = link; 
    item.AppendChild(temp); 
 
    string description = null; 
    HtmlNode descNode = entry.SelectSingleNode("//div[@class='entry-content text']"); 
    if (descNode != null) 
        description = descNode.InnerHtml; 
    // description is not always here 
    if (!string.IsNullOrEmpty(description)) 
    { 
        temp = rssDoc.CreateElement("description"); 
        temp.InnerText = description; 
        item.AppendChild(temp); 
    } 
 
}

Где sample.htm – моя сохраненная страничка.

Ну и раз я начал делать, то решил уж сделать для всех (у меня даже хостинг есть в рамках программы - Бесплатный веб-хостинг для студентов) – сделать несколько инвайтов, пригласить для начала максимум человек 100 нуждающихся в этом. А потом уже если все пойдет хорошо и всем будет комфортно, то можно и еще инвайтов наделать. Так как нужно делать web-приложение, то сразу родилась идея делать все на Microsoft MVC – надо же когда-нибудь попробовать, ну и как бы вчера сделал небольшой зародыш системы. А сегодня покопавшись на livejournal по поводу правомерности данного действия (кстати, так и не нашел, можно ли делать такой интерфейс или нет) обнаружил, что так как у меня платный (спонсируемый) аккаунт, то оказывается есть возможность экспортировать мою френд ленту в RSS – как это сделать написано тут - Friends Page RSS.

В общем свою задумку я замораживаю, так как у меня уже необходимости в ней нет (пока нет), но все же, если наберется хотя бы 20-30 человек, которым данное решение пригодиться – то могу доделать проект и выложить (правда не обещаю как скоро).

Comments