亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1106 | 回復(fù): 0
打印 上一主題 下一主題

簡(jiǎn)單的rss閱讀工具 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-07-15 10:04 |只看該作者 |倒序?yàn)g覽
RSS閱讀,訂閱網(wǎng)址在main.py的Producer中
多線程部分參考了http://python.jobbole.com/81690/ 的帖子

rss分析器
  1. #!usr/bin/env python
  2. # -*- coding:UTF-8 -*-

  3. import re
  4. from lxml import etree
  5. from bs4 import BeautifulSoup as sp
  6. import requests
  7. import urllib2
  8. import StringIO

  9. import sys
  10. reload(sys)
  11. sys.setdefaultencoding("utf-8")

  12. headers={'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}

  13. def urlread(url):
  14.     try:
  15.         req=requests.get(url,headers=headers)
  16.         req.encoding="utf-8"
  17.         return req.text.encode("utf-8")
  18.     except:
  19.         req=urllib2.Request(url,headers=headers)
  20.         response=urllib2.urlopen(req)
  21.         return response.read().encode("utf-8")
  22.             
  23. class Item:
  24.     def __init__(self,title,link,date,description):
  25.         self.title=title.strip()
  26.         self.link=link.strip()
  27.         self.pubDate=date.strip()
  28.         self.decription=self.filter(description).strip()
  29.          
  30.     def filter(self,description):
  31.         description=re.sub("<.*?>",'',description)
  32.         description=re.sub("\r",'',description)
  33.         description=re.sub("\n",'',description)
  34.         description=re.sub("&nbsp;"," ",description)
  35.         if len(description)>240:
  36.             description=description[:240]+'...'
  37.         return description        

  38.     def __str__(self):
  39.         return "%s\n%s\n%s\n<%s>\n" % (
  40.                 self.title,
  41.                 self.link,
  42.                 self.decription,
  43.                 self.pubDate
  44.                 )
  45.          
  46.     __repr__=__str__
  47.      
  48. class BSParser(object):
  49.     #url=''
  50.     def __init__(self,url):
  51.         xml=urlread(url)
  52.         self.reset(xml)
  53.          
  54.     def reset(self,xml=None):
  55.         if xml==None:
  56.             self.soup=sp("<xml> </xml>")
  57.         else:
  58.             self.soup=sp(xml,"xml")

  59.     def callback(self,method,obj,tags):
  60.         rst=None
  61.         attr=method.lower()

  62.         for tag in tags:
  63.             try:
  64.                 rst=getattr(obj,attr)(tag)
  65.             except:
  66.                 continue
  67.             if rst:
  68.                 break
  69.         return rst

  70.     def getfields(self,tags=["item",'entry']):
  71.         return self.callback(method="FIND_ALL",
  72.                             obj=self.soup,
  73.                             tags=tags)
  74.             
  75.     def gettitle(self,obj,tags=["title"]):
  76.         return self.callback("FIND",obj,tags).text
  77.          
  78.     def getlink(self,obj,tags=["link"]):      
  79.         rst=self.callback("FIND",obj,tags).text
  80.         if not rst:           
  81.             rst=self.callback("FIND",obj,tags).get("href")
  82.         return rst
  83.          
  84.     def getdate(self,obj,tags=["pubDate","published"]):
  85.         return self.callback("FIND",obj,tags).text
  86.          
  87.     def getdescription(self,obj,tags=["description","content"]):        
  88.         return self.callback("FIND",obj,tags).text
  89.      
  90.     def run(self):
  91.         for item in self.getfields():
  92.             title=self.gettitle(item)
  93.             link=self.getlink(item)
  94.             date=self.getdate(item)
  95.             description=self.getdescription(item)
  96.             newsitem=Item(title,link,date,description)
  97.             yield newsitem

  98. def test():
  99.     parser=Parser()
  100.     for item in parser.run():
  101.         print item
  102.          
  103. if __name__=="__main__":
  104.     test()
復(fù)制代碼
多線程運(yùn)行
  1. #!usr/bin/env python
  2. #coding=utf8

  3. import threading
  4. #import time
  5. import rss
  6. import Queue
  7. #import requests
  8. import output
  9. from Tkinter import END


  10. import sys
  11. reload(sys)
  12. sys.setdefaultencoding( "utf-8" )


  13. class Manual:
  14.     def __init__(self):
  15.         self.results=[]
  16.         self.lock=threading.RLock()

  17.     def put(self,results):
  18.         self.lock.acquire()
  19.         self.results.append(results)
  20.         self.lock.release()

  21. class Consumer(threading.Thread):
  22.     def __init__(self,queue,manual):
  23.         threading.Thread.__init__(self)
  24.         self._queue=queue
  25.         self.manual=manual
  26.         #self.parser=parser

  27.     def run(self):
  28.         while True:
  29.             feed=self._queue.get()
  30.             if feed=="quit":
  31.                 break
  32.             for item in rss.BSParser(feed).run():
  33.                 self.manual.put(item)

  34. def Producer():

  35.     queue=Queue.Queue()
  36.     manual=Manual()

  37.     feeds=['http://rss.cnbeta.com/rss',
  38.         "http://www.36kr.com/feed",
  39.         #"http://www.ftchinese.com/rss/feed",
  40.         "http://python.jobbole.com/feed",
  41.         "http://feed.cnblogs.com/blog/sitecateogry/python/rss",
  42.         "http://feed.yeeyan.org/select",
  43.         "http://blog.sina.com.cn/rss/1286528122.xml"
  44.         ]

  45.     worker_threads=build_worker_pool(queue,manual,4)

  46.     for feed in feeds:
  47.         queue.put(feed)
  48.      
  49.     for item in worker_threads:
  50.         queue.put("quit")

  51.     for worker in worker_threads:
  52.         worker.join()
  53.         
  54.     return manual.results

  55. def build_worker_pool(queue,manual,size):

  56.     workers=[]
  57.     for _ in range(size):
  58.         worker=Consumer(queue,manual)
  59.         worker.start()
  60.         workers.append(worker)
  61.     return workers

  62. if __name__=="__main__":
  63.     rst=Producer()
  64.     outputlist=[str(item) for item in rst]
  65.     tk=output.OutputBoard()
  66.     tk.insert(END,outputlist)
  67.     tk.mainloop()
復(fù)制代碼
TK輸出顯示界面
  1. #!usr/bin/env python
  2. #coding=utf-8

  3. from Tkinter import *
  4. from ScrolledText import ScrolledText

  5. class TextBoard(ScrolledText):
  6.     def __init__(self,parent):
  7.         ScrolledText.__init__(self,parent)
  8.         self.bind("<Control-Key-a>", self.selectText)         # 快捷鍵
  9.         self.bind("<Control-Key-A>", self.selectText)         # 快捷鍵
  10.          
  11.     def selectText(self,event):
  12.         self.tag_add(SEL,'1.0',END)
  13.         return 'break'
  14.          
  15. class OutputBoard:
  16.     def __init__(self):
  17.         self.tk=Tk()
  18.         #self.tk.pack()
  19.          
  20.         self.TBoard=TextBoard(self.tk)
  21.         self.TBoard.pack(expand=YES, fill=BOTH)         #mark here,ScrolledText欄隨窗口大小變化
  22.          
  23.     #def insert(self,pos,text):
  24.     #   method=getattr(self.TBoard,'insert')
  25.     #  method(pos,text)
  26.      
  27.     def __getattr__(self,attr):
  28.         return getattr(self.TBoard,attr)

  29.     def insert(self,pos,obj):
  30.         objparser=ObjParser()
  31.         self.TBoard.insert(pos,objparser.run(obj))      

  32. class ObjParser:
  33.      
  34.     stack=[]
  35.     intend=' '*4
  36.      
  37.     def line_intend(self,level=0):
  38.         if not self.stack:
  39.             return self.intend*level
  40.         else:
  41.             return "\n"+self.intend*level
  42.          
  43.     def parse(self,obj,level=0):
  44.         if obj is None:
  45.             self.stack.append('')
  46.         elif isinstance(obj,(int,float,long)):
  47.             self.stack.append(str(obj))
  48.         elif isinstance(obj,str):
  49.             self.stack.append(obj)
  50.         elif isinstance(obj,(list,tuple)):
  51.             self.parse_list(obj,level)
  52.         elif isinstance(obj,dict):
  53.             self.parse_dict(obj,level)
  54.             
  55.     def parse_list(self,obj,level):
  56.         level+=1
  57.         for item in obj:
  58.             if isinstance(item,(tuple,list)):
  59.                 self.stack.append(self.line_intend(level)+"\t".join(item))
  60.             else:
  61.                 self.parse(item,level)
  62.                 self.stack.append('\n')
  63.         self.stack.append(self.line_intend(level-1))
  64.          
  65.     def parse_dict(self,obj,level):
  66.         level+=1
  67.         for k,v in obj:
  68.             self.stack.append(self.line_intend(level)+str(k)+":")
  69.             self.parse(v,level)
  70.             self.stack.append(",")
  71.         self.stack.append(self.line_intend(level-1))
  72.          
  73.     def run(self,obj):
  74.         self.parse(obj,0)
  75.         return ''.join(self.stack)
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP