这边简单说一下最近倒腾的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. java连接数据库步骤

    一.加载JDBC驱动程序 Class.forName(driver) ; 如果直接是上面的代码运行,一定会报错.找不到驱动类java.lang.ClassNotFoundException: com. ...

  2. 基础算法之插入排序Insertion Sort

    原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元 ...

  3. C++ 在容器中存放函数指针

    注意,对一般c++ 98标准编译器而言,容器泛型模板是不支持直接存放函数指针的.需要typedef将函数指针重命名. 比如,一个void返回值参数也为void的函数指针,需要 typedef void ...

  4. ASP.NET MVC异步上传文件

    自己做的一个小dome.贴出来分享一下: 前端: <form id="formfile" method="post" enctype="mult ...

  5. 开发Blog整理

    开发Blog记录 清理收藏夹 太多了,来不及看了. http://blog.sina.com.cn/s/blog_67d95f40010113ec.htmlhttp://segmentfault.co ...

  6. TortoiseGit流程安装使用手册

    end if

  7. PHP文件的读取

    1.PHP部分文件操作函数 ( fopen ,fread ,filesize,fwrite,fclose ) 2.unlink()  rmdir() 删除函数 unlink(路径和文件名): rmdi ...

  8. SYN攻击

    一.TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服 ...

  9. spring IOC装配Bean(注解方式)

    1 Spring的注解装配Bean (1) Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean (2) Spring的框架中提供了与@Componen ...

  10. React之Froms

    In React, a <textarea> uses a value attribute instead. This way, a form using a <textarea&g ...