这边简单说一下最近倒腾的RSS阅读器的小东东,RSS阅读器估计很多人用过或者自己动手实现过。首先wudagang0123多年前提供的一个示例:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1559320,在其基础上,增加了一些功能,可以解析ATOM和RSS的feed格式规范,优化了程序界面,主要目的是学习了下wxpython和XML解析的一些东西。程序预览如下:

  

  

 def SaveChannelToFile(self):
impl = minidom.getDOMImplementation()
dom = impl.createDocument(None,'channel',None)
root = dom.documentElement
#add old
add_node = None
xmldoc = minidom.parse('channel.xml')
groups = xmldoc.getElementsByTagName('group')
for group in groups:
root.appendChild(group)
if group.getElementsByTagName('name')[0].firstChild.data == self.groupCombo.GetValue():
add_node = group
#add new xmldoc2 = minidom.parse(sysutils.XML_DIR+sysutils.replace_filename(self.url))
channel = xmldoc2.getElementsByTagName('channel')
if not channel:
channel = xmldoc2.getElementsByTagName('feed')
if channel:
self.rssmode = "atom"
else:
return
else:
self.rssmode = "rss"
channel_title = channel[0].getElementsByTagName('title')[0].firstChild.data
item_node = dom.createElement('item')
title_node = dom.createElement('title')
title_text = dom.createTextNode(channel_title)
mode_node = dom.createElement('mode')
mode_text = dom.createTextNode(self.rssmode)
link_node = dom.createElement('link')
link_text = dom.createTextNode(self.url)
title_node.appendChild(title_text)
mode_node.appendChild(mode_text)
link_node.appendChild(link_text)
item_node.appendChild(title_node)
item_node.appendChild(mode_node)
item_node.appendChild(link_node)
add_node.appendChild(item_node) f = open('channel.xml','wb')
writer = codecs.lookup('utf-8')[3](f)
dom.writexml(writer,encoding='utf-8')
writer.close()
f.close()

RSS阅读器的实现原理无非是利用python的模块解析RSS格式文件,将XML文件中的文章地址提取出来,实现新闻和消息的聚合。python这边专门处理RSS的模块有比较不错的,Universal Feed Parser。这边没有引入太复杂模块来实现XML的解析的必要。主要用到了python中的小型处理模块Minidom来处理XML文件。主要处理如下:    

根据xml文件是否存在channel或者feed标签来区分RSS地址源中RSS和atom两种格式,对XML文件首先提取标题存储到本地channel.XML文件,该文件记录了我们收录的主要频道信息,同时将每个频道对应的xml文件下载到本地进行保存。新建的channel.xml内容如下:

 <?xml version="1.0" encoding="utf-8"?><channel>
<group>
<name>技术频道</name>
<item><title>博客园_python学习</title>
<mode>atom</mode>
<link>http://feed.cnblogs.com/blog/u/43317/rss</link>
</item>
<item><title>博客园_KillConsole</title>
<mode>atom</mode>
<link>http://feed.cnblogs.com/blog/u/131263/rss</link></item></group><group>
<name>体育频道</name>
</group></channel>

获得了下载到的XML文件之后,就可以根据改文件进一步解析获取每个频道下面的文章了。

     def UpdateItemList(self,filename,root):
self.ChannelTree.DeleteChildren(root)
self.rssmode = self.ModeMap[self.ChannelTree.GetItemText(root)]
if self.rssmode == "rss":
self.UpdateRSSList(filename,root)
elif self.rssmode == "atom":
self.UpdateAtomList(filename,root) def UpdateAtomList(self,filename,root):
xmldoc = minidom.parse(filename)
items = xmldoc.getElementsByTagName('entry')
for item in items:
item_title=[]
titles = item.getElementsByTagName('title')
for title in titles:
newitem = self.ChannelTree.AppendItem(root,title.firstChild.data)
title_text=self.ChannelTree.GetItemText(newitem).encode('utf-8')
item_title.append(title_text)
index = 0
links = item.getElementsByTagName('id')
for link in links:
self.ItemMap[item_title[index]]=link.firstChild.data
index+=1
def UpdateRSSList(self,filename,root):
xmldoc = minidom.parse(filename)
items = xmldoc.getElementsByTagName('item')
for item in items:
item_title=[]
titles = item.getElementsByTagName('title')
for title in titles:
newitem = self.ChannelTree.AppendItem(root,title.firstChild.data)
title_text=self.ChannelTree.GetItemText(newitem).encode('utf-8')
item_title.append(title_text)
index = 0
links = item.getElementsByTagName('link')
for link in links:
self.ItemMap[item_title[index]]=link.firstChild.data
index+=1

  利用wxpython树形控件响应标题的双击事件,根据标题对应的LINK地址来打开对应的网页,即HtmlView.LoadUrl(url) 来实现打开指定网页界面。
  另外程序还实现了频道和频道组的添加和删除,功能比较简单但是可以满足基本的需求了。

  

RSS阅读器python实现概述的更多相关文章

  1. 为什么说Thunderbird是最好的桌面RSS阅读器

    也许现在再讨论RSS阅读器似乎已经过时了,毕竟随着社交网络服务的发展,通过一个带有大众评分能力的社交网络(比如reddit),相比RSS的固定订阅而言,也许你能更快地在你所关心的话题上更快地获得新的资 ...

  2. 基于JSP的RSS阅读器的设计与实现

    阅读器访问地址:http://easyrss.tk/,欢迎体验! 阅读导览 一.    概述  二.    设计的基本概念和原理 三.    设计方案 四.    主要源代码 五.    阅读器使用说 ...

  3. 一步一步学Silverlight 2系列(18):综合实例之RSS阅读器

    一步一步学Silverlight 2系列(18):综合实例之RSS阅读器   概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支 ...

  4. RSS阅读器

    RSS阅读器(Really Simple Syndication)是一种软件/程序,实质都是为了方便地读取RSS和Atom文档.大概就是实现了订阅式阅读,推送用户感兴趣的新闻,博客等(比如等某位博主更 ...

  5. [UWP]涨姿势UWP源码——极简的RSS阅读器

    涨姿势UWP,一个开源的RSS阅读器,一个纯粹的项目,一个有道德的APP,一个脱离了低级趣味的作者,一些有益于人民的代码.骚年,还等什么,来涨点姿势吧! 该项目代码可能会引起部分人群的不适,敏感人群请 ...

  6. Tiny Rss Reader - 迷你RSS阅读器

    发布新软件 TinyRss: Windows平台上的一个小巧的Rss阅读器. 用户界面: 项目地址: https://github.com/movsb/tinyrss.git 测试下载: http:/ ...

  7. RSS阅读器&BT sync

    ①RSS阅读器? 答:RSS阅读器是一种软件或是说一个程序,这种软件可以自由读取RSS和Atom两种规范格式的文档,且这种读取RSS和Atom文档的软件有多个版本,由不同的人或公司开发,有着不同的名字 ...

  8. RSS阅读器(一)——dom4j读取xml(opml)文件

    接触java不久,偶有收获,最近想做一个web版RSS阅读器来锻炼一下.手头有几个从不同版本的foxmail中导出的opml文件,大家应该都知道,opml文件就是xml格式的.那么就先从这里入手,练习 ...

  9. 网易新闻RSS阅读器

    首先需要分析网易RSS订阅中心的网页布局情况. 网易RSS订阅中心:http://www.163.com/rss/ 你会发现RSS文件由一个<channel>元素及其子元素组成,除了频道本 ...

随机推荐

  1. mongodb的一些小总结

    mongodb的安装,官网下载想要的版本,可视化工具mongovue(注意不支持mongodb3.0以上的版本) 下载mis安装,解压后bin,... 1.配置环境变量,将H:\mongodb\mon ...

  2. 【数据类型】Dictionary 与 ConcurrentDictionary 待续

    Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.通过键来检索值的速度是非常快的,接近于 O(1),这是因为 Dictionary<TKey, T ...

  3. 精析AngularJS(一)

    AngularJS简介 四个核心思想:依赖注入.模块化.双向绑定.语义化标签. AngularJS 前端 MVC 的设计与搭建 MVC(Model View Controller)模型(model)- ...

  4. BZOJ2329 [HNOI2011]括号修复

    把左括号看做$1$,右括号看做$-1$,于是查询操作等于查询一个区间左边右边最大(最小)子段和 支持区间翻转,反转,覆盖操作...注意如果有覆盖操作,之前的操作全部作废了...于是在下传标记的时候要最 ...

  5. maven私服搭建(centOS6.5)

    maven的好处和私服的应用本文不赘述,私服搭建如下: MAVEN 私服搭建(centOS 6.5 环境) 1.  准备环境,搭建centOS6.5系统环境,略 2.  准备对应的软件包如下: A. ...

  6. Linux教程:SSH免密码登录的方法

    公司里有N台服务器需要经常登录,每次ssh的时候都要输入密码实在太不爽了,今天有空一口气全部改为公钥/私钥认证,登录再也不用任何密码了. 实现步骤: 1.在你的自己的机器下面使用ssh-keygen命 ...

  7. How to Develop blade and soul Skills

    How to Develop Skills Each skill can be improved for variation effects. Some will boost more strengt ...

  8. EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(八)

    前言 本篇幅将对系统的菜单管理模块进行说明,系统的菜单采用树形结构,这样可以更好地方便层级设计和查看.本示例将说明如何通过EntityFramework读取递归的菜单树形结构,以及结合EasyUI的t ...

  9. css3各个属性的兼容

    1.transition:IE10. Firefox.Opera.Chrome支持: Safari支持替代的-webkit-transition属性: 2.animation: IE10.FIrefo ...

  10. hammer.js实现背景图手势缩放调整位置

    <!DOCTYPE html> <html> <head> <script> function getxy(e){ var a=new Array() ...