锁定老帖子 主题:让ruby简化你的工作之blog阅读器
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-09
![]() 然后,当我点击某个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 代码
title、url和items分别是blog的标题、地址和文章列表,我们将文章存储在一个数组里,默认是空的。然后再定义一个解析blog信息的方法blog_info,根据地址连接rss源并返回一个Blog对象: ruby 代码
注意,ruby方法默认返回的最后一行的运行结果,这里就是new的Blog对象,我们通过open-uri库的open方法连接地址并读取内容,然后使 用RSS模块的Parser类解析信息,最后将这些信息组织成一个Blog对象并返回。我同时关注好几个blog,那么将这些blog的rss地址放在一 个数组里,然后遍历数组分别调用blog_info得到Blog对象,最后需要考虑的就是怎么将Blog对象显示在网页里。 ruby 代码
rss_read方法最后返回Blog对象组成的数组,剩下的任务就是将这个数组里信息显示在生成的网页里。这个问题很类似生成静态html文件的需求, 那么ruby是否有类似freemark的模板语言?答案当然是yes,ruby on rails使用了ERb将ruby代码嵌入模板当中,我们当然也可以这样做。ERb类似jsp的语法,<%=name%>就是输出变量 name,<% %>中的代码就是一般的ruby代码,因此,首先定义我们的模板文件blogs.html xml 代码
遍历blogs数组,然后将blog的title输出到网页,接着就是blog.items文章列表循环输出,将文章列表放在一个div层中以便隐藏, javascript函数change用于隐藏或者显示文章列表。模板文件有了,现在需要的是读取模板文件并render,输出到结果文件: ruby 代码
完整的rss-reader.rb如下: ruby 代码
使用小窍门:最好将today.html加入FireFox的标签或者IE的收藏夹,windows下建立一个计划任务每天凌晨自动运行rss- reader.rb生成toady.html(linux可以使用cron),那么你每天早上打开浏览器就可以看到牛人们的新鲜文章了^_^,完整代码见附件. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-09
那个……Google Reader
|
|
返回顶楼 | |
发表时间:2007-07-10
gigix 写道 那个……Google Reader
我确实不知道这个工具,倒是多余了,多谢 PS:你的新blog好像没rss啊 |
|
返回顶楼 | |
发表时间:2007-07-10
dennis_zane 写道 gigix 写道 那个……Google Reader
我确实不知道这个工具,倒是多余了,多谢 PS:你的新blog好像没rss啊 http://gigix.thoughtworkers.org/xml/atom/feed.xml 用Firefox打开网站以后,看看地址栏右侧的RSS订阅图标。 |
|
返回顶楼 | |
发表时间: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的缘故 |
|
返回顶楼 | |
发表时间:2007-07-10
Please install iconv.
难道Jruby没有内建iconv库?JRuby我没有测试过。 |
|
返回顶楼 | |
发表时间:2007-07-19
Jruby没有内建iconv库。
在rexml模块的ICONV.rb文件中有一句: require "iconv" raise LoadError unless defined? Iconv 不知道Iconv需要如何定义?我把Ruby1.8.4中的iconv.dll和exe都拷贝过去,似乎不管用。 |
|
返回顶楼 | |
发表时间:2007-07-19
RSS阅读有Google Reader就够了
|
|
返回顶楼 | |
发表时间:2007-07-19
为什么不用抓虾,google reader?
不是浪费时间吗? |
|
返回顶楼 | |
发表时间:2007-07-20
换个角度,当作应用示例详解,楼上诸位应该就能释怀了吧。
|
|
返回顶楼 | |