如果说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. 可能;按照推测;恐怕