这边简单说一下最近倒腾的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. angularJS问题集结

    1.用ng-repeat循环输出遇到很奇怪的问题 : Error: [ngRepeat:dupes] http://errors.angularjs.org/1.4.6/ngRepeat/dupes? ...

  2. Windows添加和取消右键管理员权限

    亲测可用 新建文本文档,粘贴下列代码 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\runas]@="管理员取 ...

  3. webform LinQ

    LINQ,语言集成查询(Language Integrated Query)是一组用于c#和VB语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据. 他是一个 ...

  4. Python【2】-列表和元组

    一.序列 python包含六种内建的序列:列表.元组.字符串.unicode字符串.buffer对象.xrange对象. 列表可以修改,元组是不能修改的. 二.列表 列表list是变长序列,其中的内容 ...

  5. ViewBag是如何实现的

    ExpandoObject 在 MVC 3 的时候 Controller 可以通过 ViewBag 将数据传送到 View.如下就是通过 ViewBag 设置页面标题: public ActionRe ...

  6. css实现强制不换行/自动换行/强制换行

    在我们日常的编码中经常会遇到这段文字不可以换行,或者自动换行的需求.虽然这个功能在我们平时很常见但是我相信大家一定不会可以的去记住它吧(至少小月是很懒惰的从来是用什么查什么 ♦ 嘻嘻...).今天我们 ...

  7. gtp转换mbr

    http://wenku.baidu.com/link?url=P_t0U8Q-LIUdxVGHBefipAvbV6fg3jnX8hc8ugaRoo5WWd8GJePO8sBbtLON15gvOZh4 ...

  8. 【C#】 格式化说明符 string.Format WriteLine

    定义 格式说明符的语法由3个字段组成:索引号.对齐说明符和格式字段.String.Format和WriteLine都遵守同样的格式化规则. 对齐说明符 对齐说明符表示了字段中字符的最小宽度.对齐说明符 ...

  9. Bootstrap<基础十四> 按钮下拉菜单

    使用 Bootstrap class 向按钮添加下拉菜单.如需向按钮添加下拉菜单,只需要简单地在在一个 .btn-group 中放置按钮和下拉菜单即可.也可以使用 <span class=&qu ...

  10. Work around by " Due to heavy load, the latest workflow operation has been queued. " 分类: Sharepoint 2015-07-08 00:19 3人阅读 评论(0) 收藏

    I hope most of the users and developers might have come across above note and worried about it. Ther ...