`

让ruby简化你的工作之blog阅读器

阅读更多
    阅读专家和牛人的blog已经是我学习的一种主要方法之一,我每天的必做的就是关注下dreamhead、gigix、江南白衣、robbin、李锟等牛 人的blog是不是有什么新文章。不过我非常讨厌安装商业公司的rss阅读器,我害怕他们是流氓软件!而且很多阅读器的文章格式与原文有较大差异从而导致 重要信息的丢失,我还是喜欢用firefox畅游网络,这导致我不得不一次一次地在各个blog间跳转,打开n个网页查找我关注的信息,一次两次也就罢 了,天天这样实在是太麻烦了,那么,有没有什么工具来简化我的工作,他能自动每天把我关注的所有blog的文章放在一个页面里,我每天早上需要做的只是运 行下这个工具,然后打开生成的网页就可以看到牛人们的blog。甚至,我可以在windows下做个计划任务或者linux下使用cron让这个工具每天 在夜深人静的时候自动运行下,那我每天早上就可以看到牛人们新鲜出炉的好文章了。这个工具生成的网页应该类似下面这样:

然后,当我点击某个blog标题的时候会自动展开文章列表:

   
    点击文章标题就会跳转到相应的文章网页。OK,想好了需求,怎么做?写这样的东西当然是脚本语言最快了,我们用ruby来完成这个工具脚本。稍微思考下就 可以知道大概的思路,应该是通过某个方法连接到各个blog站点,然后抓取我们需要的信息集中显示在这个页面里。也许你还想到要用正则表达式去解析网页内 容等等,可想象一下这个工作量将多大,再说现在的blog都有替换模板功能,如果哪天换了模板,正则匹配就失效了,还得重新再来,这也太麻烦了。幸好, blog都有提供RSS啊,我们根本没必要那么麻烦,直接读RSS不就可以了?那么ruby有没有提供读rss的API?还是要我们自己去解析xml?这 件事问下《ruby cookbook》就OK。ruby有提供一个解析rss的库,支持rss0.9,1.0和2.0标准,权衡之下,我使用了rss2.0,后来发现也可以 正常读取rss1.0的blog。开始写我们的脚本,先建立一个Blog类用于存放信息:
ruby 代码
 
  1. class Blog  
  2.   attr_accessor:title,:url,:items  
  3.   def initialize(title,url,items=[])  
  4.     @title=title  
  5.     @url=url  
  6.     @items=items  
  7.   end  
  8. end  

    title、url和items分别是blog的标题、地址和文章列表,我们将文章存储在一个数组里,默认是空的。然后再定义一个解析blog信息的方法blog_info,根据地址连接rss源并返回一个Blog对象:
ruby 代码
 
  1. def blog_info(url)  
  2.   feed = RSS::Parser.parse(open(url).read, false)   
  3.   blog=Blog.new(feed.channel.title,url,feed.items)  
  4. end  

    注意,ruby方法默认返回的最后一行的运行结果,这里就是new的Blog对象,我们通过open-uri库的open方法连接地址并读取内容,然后使 用RSS模块的Parser类解析信息,最后将这些信息组织成一个Blog对象并返回。我同时关注好几个blog,那么将这些blog的rss地址放在一 个数组里,然后遍历数组分别调用blog_info得到Blog对象,最后需要考虑的就是怎么将Blog对象显示在网页里。
ruby 代码
 
  1. def rss_read  
  2.   urls=['http://www.blogjava.net/canonical/rss','http://dreamhead.blogbus.com/index.rdf',  
  3.         'http://michael.nona.name/rss','http://blog.csdn.net/mozilla/Rss.aspx','http://blog.csdn.net/g9yuayon/Rss.aspx']  
  4.   urls.collect do |blog_url|  
  5.     blog_info(blog_url)
  6.   end    
  7. end  

    rss_read方法最后返回Blog对象组成的数组,剩下的任务就是将这个数组里信息显示在生成的网页里。这个问题很类似生成静态html文件的需求, 那么ruby是否有类似freemark的模板语言?答案当然是yes,ruby on rails使用了ERb将ruby代码嵌入模板当中,我们当然也可以这样做。ERb类似jsp的语法,<%=name%>就是输出变量 name,<% %>中的代码就是一般的ruby代码,因此,首先定义我们的模板文件blogs.html
    
xml 代码
 
  1. <html>  
  2.     <head>  
  3.         <title>simple rss reader</title>  
  4.             <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  5.         <style rel="stylesheet" type="text/css" media="all" />  
  6. body {  
  7.     margin: 80px;  
  8.     text-align:left;  
  9.     font:normal 12px Verdana, Arial;  
  10.     background:#FFF  
  11.   }  
  12.   a:link,a:visited{  
  13.     text-decoration:none;  
  14.     color:#333333;  
  15.   }  
  16.   a:hover{  
  17.     text-decoration:none;  
  18.     color:#FF6600  
  19.   }  
  20.   .dotline {  
  21.     BORDER-BOTTOM-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-TOP-STYLE: dotted  
  22.   }  
  23.         </style>  
  24.   <script language="javascript">  
  25.            function change(name){  
  26.               var div=eval("document.all."+name);  
  27.               div.style.display=="none"?(div.style.display=""):(div.style.display="none");  
  28.            }  
  29.   </script>  
  30.   </head>  
  31.         <body>  
  32.             <p align="center"><strong>您关注的blog列表:</strong></p>  
  33.                     <num=1 %>  
  34.                     <% for blog in blogs %>  
  35.                       <% begin %>  
  36.                         <div>  
  37.                             <a href="#" onclick="change('blog<%=num%>');"><%= blog.title %></a>  
  38.                             <div id="blog<%=num%>" style="display:none">  
  39.                                 <% for item in blog.items %>  
  40.                                     &nbsp;&nbsp;&nbsp;&nbsp;  
  41.                                     <a href="<%=item.link%>" target="_blank"><%= item.title %></a>  
  42.                                     <br>  
  43.                                 <% end %>  
  44.                             </div>  
  45.                         </div>  
  46.                         <hr class=dotline color=#000000 size=1>  
  47.                         <numnum=num+1 %>  
  48.                       <%   
  49.                       rescue StandardError=>e  
  50.                          puts "错误信息"+e  
  51.                       end %>    
  52.                   <% end %>  
  53.         </body>  
  54. </html>  

    遍历blogs数组,然后将blog的title输出到网页,接着就是blog.items文章列表循环输出,将文章列表放在一个div层中以便隐藏, javascript函数change用于隐藏或者显示文章列表。模板文件有了,现在需要的是读取模板文件并render,输出到结果文件:
ruby 代码
 
  1.  blogs=rss_read()  
  2.  #读取模板文件  
  3.  template=IO.read(File.dirname(__FILE__)+"/blogs.html")  
  4.  message=ERB.new(template)  
  5.  #输出结果文件  
  6.  File.open("today.html","w+"){|file| file.puts message.result}  
     最后,我们生成的是一个today.html文件,这个网页就是我们就是我们在文章开头处展示的。message.result就是经过render后,将blogs变量传入模板文件后得到结果,我们将它写入today.html。
    完整的rss-reader.rb如下:
ruby 代码
 
  1. require 'rss/2.0'  
  2. require 'open-uri'  
  3. require 'erb'  
  4. # author dennis  
  5. # email killme2008@gmail.com  
  6.   
  7. class Blog  
  8.   attr_accessor:title,:url,:items  
  9.   def initialize(title,url,items=[])  
  10.     @title=title  
  11.     @url=url  
  12.     @items=items  
  13.   end  
  14. end  
  15. def blog_info(url)  
  16.   feed = RSS::Parser.parse(open(url).read, false)   
  17.   blog=Blog.new(feed.channel.title,url,feed.items)  
  18. end  
  19. def rss_read  
  20.   urls=['http://www.blogjava.net/canonical/rss','http://dreamhead.blogbus.com/index.rdf',  
  21.         'http://michael.nona.name/rss','http://blog.csdn.net/mozilla/Rss.aspx','http://blog.csdn.net/g9yuayon/Rss.aspx']  
  22.   urls.collect do |blog_url|  
  23.     blog_info(blog_url)
  24.   end    
  25. end  
  26. if $0==__FILE__  
  27.   blogs=rss_read()  
  28.   #读取模板文件  
  29.   template=IO.read(File.dirname(__FILE__)+"/blogs.html")  
  30.   message=ERB.new(template)  
  31.   #输出结果文件  
  32.   File.open("today.html","w+"){|file| file.puts message.result}  
  33. end  

    使用小窍门:最好将today.html加入FireFox的标签或者IE的收藏夹,windows下建立一个计划任务每天凌晨自动运行rss- reader.rb生成toady.html(linux可以使用cron),那么你每天早上打开浏览器就可以看到牛人们的新鲜文章了^_^,完整代码见附件.
  • script.zip (4.4 KB)
  • 描述: blog阅读器
  • 下载次数: 178
分享到:
评论
22 楼 corel 2007-08-14  
支持一下
21 楼 猫尾摆摆 2007-08-13  
 blogs=rss_read()   
 #读取模板文件   
 template=IO.read(File.dirname(__FILE__)+"/blogs.html")   
 message=ERB.new(template)   
 #输出结果文件   
 File.open("today.html","w+"){|file| file.puts message.result}  
20 楼 mathsfan 2007-07-23  
你可以自己试下自己的啊,你的应该是:
http://dennis-zane.iteye.com/admin/rss_blog_all
谢谢了```
19 楼 mathsfan 2007-07-23  
我设登陆为自动登陆了啊,电脑里有cookie的也不行的?你的意思是我将其导出为xml以后再对这个文件进行分析?那不也有点麻烦的哦```
18 楼 dennis_zane 2007-07-23  
mathsfan 写道
呵呵,对了,如果还是用这个方法去搜索比如javaeye的blog里面全部的文章([url=http://msdn.iteye.com/admin/rss_blog_all如我的[/url])好象有点问题```
XML (RSS::NotWellFormedError)
Missing end tag for 'td' (got "div")
Line:
Position:
Last 80 unconsumed characters:


因为我感觉有时自己以前弄的东西太久了有点忘了,想重新去找一下,那么多文章一页一页的去找很麻烦,所以想象这样去弄哈,你能不能试下的看能不能做的?谢谢了




你给的那个url是需要验证登录的,我进去就看到一个提示登录的页面了,不过javaeye有导出blog的功能,将导出的本地xml文件的地址写进去也一样。
17 楼 mathsfan 2007-07-23  
呵呵,对了,如果还是用这个方法去搜索比如javaeye的blog里面全部的文章([url=http://msdn.iteye.com/admin/rss_blog_all如我的[/url])好象有点问题```
XML (RSS::NotWellFormedError)
Missing end tag for 'td' (got "div")
Line:
Position:
Last 80 unconsumed characters:


因为我感觉有时自己以前弄的东西太久了有点忘了,想重新去找一下,那么多文章一页一页的去找很麻烦,所以想象这样去弄哈,你能不能试下的看能不能做的?谢谢了


16 楼 dennis_zane 2007-07-23  
mathsfan 写道
呵呵,的确很不错,我又加了一个发表时间的,看起来更实用一点,觉得在你这基础上完善一个我自己用的


呵呵,我自己还增加了一个最近blog功能,收集两日内更新的blog文章,修改下也是很简单。
15 楼 mathsfan 2007-07-23  
呵呵,的确很不错,我又加了一个发表时间的,看起来更实用一点,觉得在你这基础上完善一个我自己用的
14 楼 dennis_zane 2007-07-23  
还有人关注这个帖子^_^

我修改了下,支持atom了,参见
http://www.blogjava.net/killme2008/archive/2007/07/11/129651.html
13 楼 mathsfan 2007-07-23  
很棒,最近正想做一个这方面的东西。
感谢```
12 楼 he200377 2007-07-22  
思路很不错,我首先想到的是 用正则 去匹配
11 楼 rainchen 2007-07-20  
换个角度,当作应用示例详解,楼上诸位应该就能释怀了吧。
10 楼 chenge 2007-07-19  
为什么不用抓虾,google reader?
不是浪费时间吗?
9 楼 Suninny 2007-07-19  
RSS阅读有Google Reader就够了
8 楼 zeroliu 2007-07-19  
Jruby没有内建iconv库。
在rexml模块的ICONV.rb文件中有一句:
require "iconv"
raise LoadError unless defined? Iconv
不知道Iconv需要如何定义?我把Ruby1.8.4中的iconv.dll和exe都拷贝过去,似乎不管用。
7 楼 zy13 2007-07-16  
太感谢你了
你的代码给了我一个很好的启示
6 楼 edge_hh 2007-07-11  
ruby 下的确是好的。
5 楼 dennis_zane 2007-07-10  
Please install iconv.

难道Jruby没有内建iconv库?JRuby我没有测试过。
4 楼 edge_hh 2007-07-10  
hi, lz
我试了一下你的代码,发现在读GBK encoding的rss源会出错

C:\temp\script>jruby rss-reader.rb
no such file to load -- rexml/encodings/GBK
C:/jruby-1.0.0RC2/lib/ruby/1.8/rexml/encoding.rb:42:in `encoding=': No decoder f
ound for encoding GBK.  Please install iconv. (ArgumentError)
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rexml/source.rb:47:in `encoding='
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rexml/parsers/baseparser.rb:203:in `
pull'
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rexml/parsers/streamparser.rb:16:in
`parse'
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rexml/document.rb:185:in `parse_stre
am'
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rss/rexmlparser.rb:22:in `_parse'
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rss/parser.rb:163:in `parse'
        from C:/jruby-1.0.0RC2/lib/ruby/1.8/rss/parser.rb:78:in `parse'
        from rss-reader.rb:16:in `blog_info'
        from rss-reader.rb:22:in `rss_read'
        from rss-reader.rb:26:in `collect'
        from rss-reader.rb:23:in `rss_read'
        from rss-reader.rb:26


不知道是不是我是英文winxp的缘故
3 楼 gigix 2007-07-10  
dennis_zane 写道
gigix 写道
那个……Google Reader

我确实不知道这个工具,倒是多余了,多谢
PS:你的新blog好像没rss啊

http://gigix.thoughtworkers.org/xml/atom/feed.xml
用Firefox打开网站以后,看看地址栏右侧的RSS订阅图标。

相关推荐

    《Ruby Programming—向Ruby之父学程序设计(第2版)》电子书

    总的来说,《Ruby Programming—向Ruby之父学程序设计(第2版)》是一本全面的教程,旨在引导读者从零基础逐步掌握Ruby编程,无论你是想成为一名全栈Web开发者,还是对编程充满好奇,这本书都将为你提供坚实的起点。...

    Ruby-MongoMapper针对Mongo的一个Ruby对象映射器

    Ruby的MongoMapper库就是为了让开发者能够更自然地在Ruby对象和MongoDB文档之间进行映射,从而简化数据操作。 MongoMapper的设计理念深受ActiveRecord的影响,它是Ruby on Rails框架中的核心组件,但MongoMapper...

    ruby中英文api

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法著称,尤其适合Web开发,其中Rails框架是其最著名的应用之一。API(Application Programming Interface)是软件开发者用来与操作系统、库或服务进行...

    Ruby-GLI类似Git接口的命令行解析器

    通过阅读和研究这些源码,你可以深入了解其内部工作原理,如何与Ruby语言特性结合,以及如何自定义和扩展GLI以适应特定项目需求。这不仅有助于提高你的Ruby编程技巧,还能增强你对命令行应用设计的理解。 总的来说...

    ruby for eclipse 插件安装

    安装Ruby for Eclipse插件后,你就可以开始你的Ruby开发之旅了。在创建新项目时,选择Ruby项目类型,Eclipse会为你配置好项目的结构。在编写代码时,插件会提供代码高亮和智能提示,帮助你快速编写出符合Ruby语法的...

    ruby中文文档(ruby入门级别教程)

    Rails是一个基于Ruby的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,极大地简化了Web应用的开发过程。 本压缩包提供的“ruby中文文档”包含了四个主要部分,对于初学者来说是一份非常实用的学习...

    ruby.rar

    Ruby由日本人松本行弘(Yukihiro Matsumoto)于1995年创建,它的设计目标是提供一种易于阅读和书写的语言,同时又不失灵活性和表达力。Ruby支持多种编程范式,包括面向对象、函数式、命令式和反射。它具有动态类型系统...

    Ruby相关入门教程网址

    标题中的“Ruby相关入门教程网址”表明这是一份关于学习Ruby编程语言的资源,而描述中的“博文链接:https://musicbox95351.iteye.com/blog/1797113”提示我们可以从这个链接找到更多关于Ruby的入门教程。...

    .一步一步学RUBY

    - **语句块与迭代器**:Ruby支持简洁的循环语法,如`each`等迭代器,简化了集合操作和循环逻辑的编写。 - **表达式与操作符**:Ruby允许字符串等类型的乘法操作,进一步体现了其对多种数据类型的支持和灵活处理能力...

    Ruby-rabl普通的ruby模板包含jsonbsonxmlplist和msgpack支持

    RABL的MsgPack支持让你能够快速地将Ruby对象转换为MsgPack格式的数据。 **RABL的使用** 在实际项目中,RABL可以通过`render`方法在Rails或其他基于Ruby的框架中使用,将模板应用于模型实例,然后返回格式化的数据。...

    ruby语言入门教程(中文版)[PDF]

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年设计并开发。...通过阅读并实践教程中的例子,读者可以逐步掌握Ruby编程,并开启在Ruby世界中的探索之旅。

    wabr-ruby:Web API 条码阅读器 - Ruby SDK

    使用test.rb和sample_code.rb示例代码先决条件: rest_client表单创建阅读器 include "wabr.rb" ;reader = WABarcodeReader . new ( serverUrl , auth ) 在哪里serverURL是 WABR 服务器 URL 它是您托管服务器的 URL...

    Ruby设计模式(中文版+英文版).pdf

    主要包括Ruby概述、使用模板方法变换算法、使用策略替换算法、通过观察器保持协调、通过迭代器遍历集合、使用命令模式完成任务、使用适配器填补空隙、使用装饰器改善对象、单例、使用工厂模式挑选正确的类、通过生成...

    Ruby 技术手册(CHM 电子版)

    《Ruby技术手册》是一部关于Ruby编程语言的权威指南,以CHM(Microsoft Compiled HTML Help)格式呈现,方便读者查阅和学习。...通过深入阅读和实践,你将能够更好地理解和运用Ruby这一强大而优雅的语言。

    Ruby-kitabu一个框架使用Ruby来从Markdown创建电子书籍

    EPUB是一种开放标准的电子书格式,被许多电子阅读器和软件广泛支持,它允许内容动态重排,适应不同的屏幕尺寸。Mobi则是Amazon Kindle设备和应用程序所使用的专有格式。通过kitabu,用户可以确保他们的电子书能够在...

    ruby on rails for dummies

    《Ruby on Rails for Dummies》是一本专门为初学者设计的Ruby on Rails教程,它旨在帮助新手快速理解并掌握这个强大的...通过阅读和实践书中的例子,你将能够掌握构建现代Web应用所需的技能,并开启你的Rails开发之旅。

    Ruby读取INI文件

    Ruby没有内置的INI解析器,但可以通过第三方库如`configparser`或者自定义代码来实现。在这个场景中,我们可以看到两个文件:`test.ini`是待处理的INI配置文件,而`ini_reader.rb`可能是用来读取和解析该文件的Ruby...

    Ruby-EeePub是一个Ruby电子书ePub生成器

    此外,它还提供了验证功能,确保生成的EPUB文件符合规定,可被各种阅读器正确解析。 7. **API友好**:由于是Ruby库,Ruby-EeePub可以轻松集成到其他Ruby项目中,使得电子书的自动化生产和发布成为可能。 在使用...

    Ruby-Chronic一个纯Ruby编写的自然语言日期时间解析器

    它的主要功能是将人类可读的日期和时间字符串转换为精确的日期和时间对象,极大地简化了程序员在处理用户输入的时间信息时的工作。这个库的强大之处在于它能够理解多种格式的非标准日期和时间表达方式,而无需严格...

    Everyday Scripting With Ruby

    - **Ruby on Rails**:这是最著名的Ruby框架之一,遵循MVC(模型-视图-控制器)模式,简化了Web应用程序的开发过程。 - **Sinatra**:一个轻量级的Web应用程序框架,非常适合构建小型应用程序或API。 #### 五、错误...

Global site tag (gtag.js) - Google Analytics