这边简单说一下最近倒腾的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. 使用caffe时遇到的问题

    1.Error: (unix time) try if you are using GNU date 问题所在: 在训练train.txt图片列表位置和生成的lmbd数据不符. 解决方案: 修改tra ...

  2. C++ 多态、虚函数机制以及虚函数表

    1.非virtual函数,调用规则取决于对象的显式类型.例如 A* a  = new B(); a->display(); 调用的就是A类中定义的display().和对象本体是B无关系. 2. ...

  3. 安卓xml文件中常见的问题

    1.EditText显示不完全

  4. UITableViewCell 顶格

    首先在ViewDidLoad 或者ViewWillAppear里边写 if ([_tabView respondsToSelector:@selector(setSeparatorInset:)]) ...

  5. 安装VS 2013遇到的问题,及解决方案

    一.在启动调试时报错 Visual Studio 2013 虽然集成安装了 IIS Express 8.0,但是并未安装 WebMatrix ,第一个问题就是这个原因造成的. 解决方案: 1.下载最新 ...

  6. SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试 [T]

    SQL Server 2008中SQL应用系列--目录索引 前些天看到一篇文章<SQL Server 2012 - Server side paging demo using OFFSET/FE ...

  7. NSTimer “定时器”

    •NSTimer叫做“定时器”,它的作用如下 Ø在指定的时间执行指定的任务 Ø每隔一段时间执行指定的任务 Ø •调用下面的方法就会开启一个定时任务 + (NSTimer *)scheduledTime ...

  8. Visual Studio 2015 新建MVC项目 Package Manager Console不能使用 (HRESULT: 0x80131500)

    Visual studio 2015 突然新建不了MVC项目,报出错误: HRESULT: 0x80131500 在折腾了很长时间,最后在Github上看到这样一个贴 地址:https://githu ...

  9. wxPython入门练习代码 三

    DoubleEventFrame.py: #!/usr/bin/env/ python import wx class DoubleEventFrame(wx.Frame): def __init__ ...

  10. Spring 通过配置文件注入 properties文件

    当我们需要将某些值放入 properties文件 key=value 的方式,获取文件信息使用spring 注入的方式会变得很便捷 1. spring 配置文件需要导入 <?xml versio ...