这边简单说一下最近倒腾的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. 如何实现自定义的android WebView错误页

    一般来说,可能第一时间想到的是自定义一个html来替代webview内置的异常页面.  但是实际操作时,这种方法比较困难. 这里介绍一个简单的替代方案,希望能有所帮助. 可以采用嵌套layout的方式 ...

  2. [HTML/JS] JQuery 页面滚动回到顶部

    HTML: <html> <body> <div id="back-to-top" style="cursor:pointer; displ ...

  3. SAP语音读汉字

    厉害了,WORD哥! 输入汉字,竟然可以读出来... 这真是变态用户必备神技啊 REPORT ZLYTEST001. INCLUDE OLE2INCL. DATA: OLE TYPE OLE2_OBJ ...

  4. webservice服务的简单应用

    本人目前刚接触到webservice服务,知道它是一个为外部提供接口的服务,下面大概讲一下webservice是如何应用的. 在此我只针对ASP.NET 讲一个是如何应用的: 1. 打开VS ,在WE ...

  5. 实现password框中显示文字提示的方式

    其实实际上实现中并不能让password中显示文字提示,但是我们在工作中有这样的需求,当没输入东西的时候,框内有提示输入密码,但是当输入东西的时候又显示的是*号,那么是如何实现的呢?其实原理很简单,就 ...

  6. 解决OS X系统连接VPN后无法访问内网资源的问题

    该问题是第一次使用OS X系统连接VPN遇到的问题,现象是连接VPN成功,但无法访问公司的内网资源. 主要原因还是VPN设置上的问题,在系统偏好设置中打开VPN连接,里面有个高级设置,如图: 点击高级 ...

  7. oracle date change

    select to_char(sysdate,'yyyy') from dual;-----2016select to_number(to_char(sysdate,'MM'))||'月' from ...

  8. socketserver 分块记录

    网络编程 Socket(TCP,IP)套接字 服务端 运行起来, 客户端 客户端 客户端 客户端 服务端: import socket sk = socket.socket() #绑定端口号 sk.b ...

  9. 【Python②】python之首秀

       第一个python程序 再次说明:后面所有代码均为Python 3.3.2版本(运行环境:Windows7)编写. 安装配置好python后,我们先来写第一个python程序.打开IDLE (P ...

  10. React + Redux 入坑指南

    Redux 原理 1. 单一数据源 all states ==>Store 随着组件的复杂度上升(包括交互逻辑和业务逻辑),数据来源逐渐混乱,导致组件内部数据调用十分复杂,会产生数据冗余或者混用 ...