python电子英汉词典显示_python网页抓取之英汉字典+自学习能力

上篇每次翻译一个单词都要联网抓取,重复翻译也要抓取,感觉不太好。晚上突然想到了一个不错的办法,

说白了就是查询数据库如果有这个单词就拿出来,没有就联网抓取显示出来并保存进

数据库。时间长了几乎就不用联网了,也就是离线了!

本人使用的数据库是sqlite,小巧简单。当然用其他的也可以了。还是看代码吧。

代码增加的不多,有些可以优化先不管啦。用BeautifulSoup解析html更容易写,可以看上篇文章。

dict.py: python-2.7.5

1 #!/usr/bin/python

2 importurllib2,sys,sqlite33 from HTMLParser importHTMLParser4

5 classMyHTMLParser(HTMLParser):6 def __init__(self):7 HTMLParser.__init__(self)8 self.t=False9 self.trans=[]10 self.prs=[]11 self.pr=False12 defhandle_starttag(self, tag, attrs):13 if tag=='div':14 for attr inattrs:15 if attr==('class','hd_prUS') or\16 attr==('class','hd_pr'):17 self.pr=True18 if tag=='span':19 for attr inattrs:20 if attr==('class','def'):21 self.t=True22 defhandle_data(self, data):23 ifself.t:24 length=len(self.trans)+1

25 self.trans.append(str(length)+"."+data)26 self.t=False27 ifself.pr:28 self.prs.append(data)29 self.pr=False30 defgetTrans(self):31 returnself.trans32 defgetPr(self):33 returnself.prs34 classtrans:35 _URL='http://cn.bing.com/dict/search'

36 _DBPATH='./dic.sqlite' #数据库文件位置

37 def __init__(self):38 self.url=trans._URL+"?q=%s&go=&qs=bs&form=CM&mkt=zh-CN&setlang=ZH"

39 self.html=None40 self.s=None #保存翻译41 self.pr=None #保存发音(US和UK)42 self.word=None #保存单词43 self.conn=sqlite3.connect(trans._DBPATH)44 self.cur =self.conn.cursor()45 defgetHtml(self):46 self.url=self.url %self.word47 req =urllib2.Request(self.url)48 fd=urllib2.urlopen(req)49 self.html=fd.read()50 self.html=unicode(self.html,'utf-8')51 fd.close()52

53 defparseHtml(self):54 parser =MyHTMLParser()55 self.html=parser.unescape(self.html) #处理&、等开头的特殊字符串56 parser.feed(self.html)57 self.s=parser.getTrans()58 self.pr=parser.getPr()59 print self.word,':'

60 #for sk in self.pr:

61 print self.pr[0],',',self.pr[1]62 print ''

63 for i inself.s:64 printi65

66 defsaveDB(self): #把单词信息插入数据库67 sjoin='\n'.join(self.s)68 uspr=self.pr[0]69 ukpr=self.pr[1]70 #self.cur.execute("create table if not exists translate ( word CHAR(40) primary key, us CHAR(40), uk CHAR(40), trans text )")

71 self.cur.execute("insert into translate values(?,?,?,?);", \72 (self.word,uspr,ukpr,sjoin))73 self.conn.commit()74

75 defisExists(self,word): #判断单词是否在db中,如果在直接打印出来。76 self.word=word77 rows=self.cur.execute("select * from translate where word=?",(self.word,))78 key=rows.fetchall()79 if key==[]:80 returnFalse81 else:82 for row inkey:83 print row[0],':'

84 print row[1],",",row[2]85 print ''

86 print row[3]87 returnTrue88 defselect(self): #测试查看用的,删不删无所谓啦89 rows=self.cur.execute("select * from translate")90 for row inrows:91 printrow[0]92 print row[1],",",row[2]93 print row[3]94 defcloseDB(self):95 self.conn.close()96 if __name__=='__main__':97 t=trans()98 flag=t.isExists(sys.argv[1])99 if notflag:100 t.getHtml()101 t.parseHtml()102 t.saveDB()103 #t.select()

104 t.closeDB()

终端运行:

08:59@:~/workspace$ ./dic.py believe --------->这是第一次的,联网抓取的

believe :

美 [bɪˈliv] , 英 [bɪˈliːv]1. 相信;认为真实;把(某事)当真;认为有可能2. 认定;看作;表示对某事吃惊或恼怒;有宗教信仰3. 信任;我相信;你不渺小09:00@:~/workspace$ ./dic.py believe --------->第二次从db中获取的(在查询里加个输出就知道是从db取出的了)

believe :

美 [bɪˈliv] , 英 [bɪˈliːv]1. 相信;认为真实;把(某事)当真;认为有可能2. 认定;看作;表示对某事吃惊或恼怒;有宗教信仰3. 信任;我相信;你不渺小

第二次翻译比第一次快多了,能感觉到。当然这是数据库中的信息比较少,多了的话现在不能下结论。

还有就是数据库本人用了四列,分别是word、us(美式发音)、uk(英式)、trans(翻译)。表名translate。

类型分别是char、char、char、text。

Note:注释是写博客后来加上去的,可以直接删了,或者添加# -*- coding: utf-8 -*-

本人是在linux下编写运行的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值