如果说java是建造高楼的砖石,那么python就是一支素质良好的施工队。
有一天,我苦于在ubuntu下没有找到词典应用,不得不打开网页,诸如有道词典这样的,然后输入单词。
凑合可用。但是网页内容太多,而且切换不易。于是决定用python解析这些网页,提取翻译。
首先,我们需要一个类似httpclient的工具,相当于浏览器的交流工具,然后还要一个html解析器。
当然我们不许要自己动手建造,只需要import httplib, import urllib,import sgmllib 即可。
好吧,来看我们是如何从有道词典抓数据的。
#!/usr/bin/evn python # -*- coding: utf-8 -*- import httplib import urllib import sys from sgmllib import SGMLParser class GetTrans(SGMLParser): def reset(self): self.text = [] self.flag = False self.getdata = False self.layer = 0 SGMLParser.reset(self) def start_div(self, attrs): if self.flag == True: self.layer += 1 return for k, v in attrs: if (k == 'id' and v =='phrsListTab') or (k == 'class' and v == 'phonetic'): self.flag = True return def end_div(self): if self.layer == 0: self.flag = False if self.flag == True: self.layer -= 1 def start_ul(self, attrs): if self.flag == False: return self.getdata = True def end_ul(self): if self.getdata: self.getdata = False def start_span(self,attrs): if self.flag == False: return self.getdata = True def end_span(self): if self.getdata: self.getdata = False def handle_data(self, text): if self.getdata: self.text.append(text) def printText(self): for i in self.text: print i def sendhttp(key): data = urllib.urlencode({'q':key,'le':'eng','from':'dict.index'}) headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"} conn = httplib.HTTPConnection("dict.youdao.com"); conn.request('POST', '/search', data, headers) httpres = conn.getresponse() t = GetTrans() t.feed(httpres.read()) t.printText() conn.close() if __name__ == '__main__': while True: print "please input word:\n" word = raw_input() sendhttp(word) if word == 'quit': break print 'bye'
代码很少,最多的是如何解析html,这里使用的解析类似xml解析中的节点方法,定义遇到html标签时的处理方法,例如,如果要处理 <body>那么,定义这样的函数 start_body 当然当处理</body>时,需要 end_body这样的函数。我们只需定义关心的标签。这里需要注意的是标签的套嵌,我们使用layer来判断。
接下来就是模拟一个http的请求,构造一个url请求,然后返回结果。
httplib 还有更强大的httplib2。有心的同学可以去研究。这个简易词典已经能工作了。你可以根据自己的需求修改代码。快来动手吧。
please input word: supposedly supposedly 英 [sə'pəʊzɪdlɪ] 美 [sə'pozɪdli] adv. 可能;按照推测;恐怕