设为首页 收藏本站
查看: 3763|回复: 0

[经验分享] RSS阅读器python实现概述

[复制链接]

尚未签到

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

  





1 def SaveChannelToFile(self):
2         impl = minidom.getDOMImplementation()
3         dom = impl.createDocument(None,'channel',None)
4         root = dom.documentElement
5         #add old
6         add_node = None
7         xmldoc = minidom.parse('channel.xml')
8         groups = xmldoc.getElementsByTagName('group')
9         for group in groups:
10             root.appendChild(group)
11             if group.getElementsByTagName('name')[0].firstChild.data == self.groupCombo.GetValue():
12                 add_node = group
13         #add new
14
15         xmldoc2 = minidom.parse(sysutils.XML_DIR+sysutils.replace_filename(self.url))
16          channel = xmldoc2.getElementsByTagName('channel')
17         if not channel:
18             channel = xmldoc2.getElementsByTagName('feed')
19             if channel:
20                 self.rssmode =  "atom"
21             else:
22                 return
23         else:
24             self.rssmode = "rss"
25         channel_title = channel[0].getElementsByTagName('title')[0].firstChild.data
26         item_node = dom.createElement('item')
27         title_node = dom.createElement('title')
28         title_text = dom.createTextNode(channel_title)
29         mode_node = dom.createElement('mode')
30         mode_text = dom.createTextNode(self.rssmode)
31         link_node = dom.createElement('link')
32         link_text = dom.createTextNode(self.url)
33         title_node.appendChild(title_text)
34         mode_node.appendChild(mode_text)
35         link_node.appendChild(link_text)
36         item_node.appendChild(title_node)
37         item_node.appendChild(mode_node)
38         item_node.appendChild(link_node)
39         add_node.appendChild(item_node)
40         
41         f = open('channel.xml','wb')
42         writer = codecs.lookup('utf-8')[3](f)
43         dom.writexml(writer,encoding='utf-8')
44         writer.close()
45         f.close()
View Code   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内容如下:



1
2
3 技术频道
4 博客园_python学习
5 atom
6 http://feed.iyunv.com/blog/u/43317/rss
7
8 博客园_KillConsole
9 atom
10 http://feed.iyunv.com/blog/u/131263/rss
11 体育频道
12
  获得了下载到的XML文件之后,就可以根据改文件进一步解析获取每个频道下面的文章了。





1     def UpdateItemList(self,filename,root):
2         self.ChannelTree.DeleteChildren(root)
3         self.rssmode = self.ModeMap[self.ChannelTree.GetItemText(root)]
4          if self.rssmode == "rss":
5              self.UpdateRSSList(filename,root)
6          elif self.rssmode == "atom":
7              self.UpdateAtomList(filename,root)
8     
9     def UpdateAtomList(self,filename,root):
10         xmldoc = minidom.parse(filename)
11         items = xmldoc.getElementsByTagName('entry')
12         for item in items:
13             item_title=[]
14             titles = item.getElementsByTagName('title')            
15             for title in titles:
16                 newitem = self.ChannelTree.AppendItem(root,title.firstChild.data)
17                  title_text=self.ChannelTree.GetItemText(newitem).encode('utf-8')
18                  item_title.append(title_text)
19              index = 0
20             links = item.getElementsByTagName('id')
21             for link in links:
22                 self.ItemMap[item_title[index]]=link.firstChild.data
23                 index+=1         
24     def UpdateRSSList(self,filename,root):
25         xmldoc = minidom.parse(filename)
26         items = xmldoc.getElementsByTagName('item')
27         for item in items:
28             item_title=[]
29             titles = item.getElementsByTagName('title')            
30             for title in titles:
31                 newitem = self.ChannelTree.AppendItem(root,title.firstChild.data)
32                  title_text=self.ChannelTree.GetItemText(newitem).encode('utf-8')
33                  item_title.append(title_text)
34              index = 0
35             links = item.getElementsByTagName('link')
36             for link in links:
37                 self.ItemMap[item_title[index]]=link.firstChild.data
38                 index+=1   
View Code   利用wxpython树形控件响应标题的双击事件,根据标题对应的LINK地址来打开对应的网页,即HtmlView.LoadUrl(url) 来实现打开指定网页界面。
  另外程序还实现了频道和频道组的添加和删除,功能比较简单但是可以满足基本的需求了。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60093-1-1.html 上篇帖子: python爬虫实现(使用线程池) 下篇帖子: python登录csdn并自动评论下载资源脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表