`
airu
  • 浏览: 267490 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

python与web

阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics