【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)

全系列目录:

承接上文。

现在来进行response模块的开发。

这一模块所完成的任务是,如果本地的词库中没有用户需要查询的词汇,那么就去网络上寻找到相应的词条作为结果返回,并存入本地数据库。

我选择的网上的源是iciba,理由很简单,不需要复杂的cookie管理,所查词汇的内容基本集成在返回的html源文件中。

值得注意的是,如果请求过于频繁,那么会被iciba ban掉,所以如果要利用这段代码爬iciba的词库,请自行加个sleep。不过好像我代码中也有,注意改下便是。

该模块的逻辑为:

0、提供一个接口给其他模块调用,输入为待查词汇。

1、构造url请求,获得返回的数据。

2、根据数据的格式,解析返回的数据并获取相应词条的内容

3、按照约定的格式返回相应词条的内容给调用其的其他模块

具体的做法参考源代码

# -*- coding:utf-8 -*-
__author__ = ‘wmydx‘

import urllib
import re
import urllib2
import time

class GetResponse:

    def __init__(self):
        self.url = ‘http://www.iciba.com/‘
        self.isEng = re.compile(r‘(([a-zA-Z]*)(\s*))*$‘)
        self.group_pos = re.compile(r‘<div class="group_pos">(.*?)</div>‘, re.DOTALL)
        self.net_paraphrase = re.compile(r‘<div class="net_paraphrase">(.*?)</div>‘, re.DOTALL)
        self.sentence = re.compile(r‘<dl class="vDef_list">(.*?)</dl>‘, re.DOTALL)

    def process_input(self, word):
        word = word.strip()
        word = word.replace(‘ ‘, ‘_‘)
        return word

    def get_data_from_web(self, word):
        headers = {‘Referer‘: ‘http://www.iciba.com/‘, ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1)         AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36‘}
        request = urllib2.Request(self.url + word, headers=headers)
        while True:
            try:
                f = urllib2.urlopen(request).read()
                break
            except:
                pass
        return f

    def get_eng_from_chinese(self, word):
        word = self.process_input(word)
        word = urllib.quote(word)
        data = self.get_data_from_web(word)
        label_lst = re.compile(r‘<span class="label_list">(.*?)</span>‘, re.DOTALL)
        label_itm = re.compile(r‘<label>(?P<item>.*?)</a>(.*?)</label>‘, re.DOTALL)
        first = label_lst.search(data)
        data = data[first.start():first.end()]
        start_itm = 0
        res = []
        while 1:
            second = label_itm.search(data, start_itm)
            if not second:
                break
            word = self.get_sentence_from_dt(data[second.start(‘item‘):second.end(‘item‘)])
            res.append(word)
            start_itm = second.end()
        return res

    def get_dict_data(self, word):
        englst = []
        res = []
        match = self.isEng.match(word)
        if not match:
            englst = self.get_eng_from_chinese(word)
        else:
            englst.append(word)
        for item in englst:
            word = self.process_input(item)
            data = self.get_data_from_web(word)
            if data.find(‘对不起,没有找到‘) != -1:
                res.append(-1)
            else:
                tmp_dict = self.analysis_eng_data(data)
                tmp_dict[‘word‘] = word
                tmp_dict[‘times‘] = 1
                res.append(tmp_dict)
        return res

    def analysis_eng_data(self, data):
        res = {}
        explain = self.group_pos.search(data)
        if explain:
            explain = data[explain.start():explain.end()]
            res[‘explain‘] = self.generate_explain(explain)
        else:
            res[‘explain‘] = -1
        net_explain = self.net_paraphrase.search(data)
        if net_explain:
            net_explain = data[net_explain.start():net_explain.end()]
            res[‘net_explain‘] = self.generate_net_explain(net_explain)
        else:
            res[‘net_explain‘] = -1
        sentence_start = 0
        sentence_end = len(data)
        sentence_lst = []
        while sentence_start < sentence_end:
            sentence = self.sentence.search(data, sentence_start)
            if sentence:
                sentence_str = data[sentence.start():sentence.end()]
            else:
                break
            sentence_lst.append(self.generate_sentence(sentence_str))
            sentence_start = sentence.end()
        res[‘sentence‘] = "\n\n".join(sentence_lst)
        return res

    def generate_explain(self, target):
        start_word = 0
        end_word = len(target)
        meta_word = re.compile(r‘<strong class="fl">(?P<meta_word>.*?)</strong>‘, re.DOTALL)
        label_lst = re.compile(r‘<span class="label_list">(.*?)</span>‘, re.DOTALL)
        label_itm = re.compile(r‘<label>(?P<item>.*?)</label>‘, re.DOTALL)
        res = ‘‘
        while start_word < end_word:
            first = meta_word.search(target, start_word)
            if first:
                word_type = target[first.start(‘meta_word‘):first.end(‘meta_word‘)]
            else:
                break
            res += word_type + ‘ ‘
            second = label_lst.search(target, first.end(‘meta_word‘))
            start_label = second.start()
            end_label = second.end()
            while start_label < end_label:
                third = label_itm.search(target, start_label)
                if third:
                    res += target[third.start(‘item‘):third.end(‘item‘)]
                    start_label = third.end()
                else:
                    break
            res += ‘\n‘
            start_word = end_label
        return res

    def generate_net_explain(self, target):
        start_itm = 0
        end_itm = len(target)
        li_item = re.compile(r‘<li>(?P<item>.*?)</li>‘, re.DOTALL)
        res = ‘网络释义: ‘
        while 1:
            first = li_item.search(target, start_itm)
            if first:
                res += target[first.start(‘item‘):first.end(‘item‘)]
            else:
                break
            start_itm = first.end()
        return res

    def generate_sentence(self, target):
        res = ‘‘
        english = re.compile(r‘<dt>(?P<eng>.*?)</dt>‘, re.DOTALL)
        chinese = re.compile(r‘<dd>(?P<chn>.*?)</dd>‘, re.DOTALL)
        first = english.search(target)
        second = chinese.search(target)
        res += self.get_sentence_from_dt(target[first.start(‘eng‘):first.end(‘eng‘)]) + ‘\n‘
        res += target[second.start(‘chn‘):second.end(‘chn‘)]
        return res

    def get_sentence_from_dt(self, target):
        res = ‘‘
        length = len(target)
        index = 0
        while index < length:
            if target[index] == ‘<‘:
                while target[index] != ‘>‘:
                    index += 1
            else:
                res += target[index]
            index += 1
        return res

if __name__ == ‘__main__‘:
    p = GetResponse()
    test = [‘hello‘, ‘computer‘, ‘nothing‘, ‘bad guy‘, ‘someday‘]
    for item in test:
        res = p.get_dict_data(item)
        for key in res:
            for (k, v) in key.items():
                print "dict[%s]=" % k, v
            print
        time.sleep(3)
时间: 2024-10-25 02:56:05

【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)的相关文章

【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)

全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdict开发日记:基于linux的简明英汉字典(三) [原创]shadowebdict开发日记:基于linux的简明英汉字典(四) 项目的github地址 实习的工作都这么忙,真是的.. 好不容易有时间写点博客,一鼓作气完成算了 承接上文 本文完成对本地数据库模块的开发. 由于只是非常轻量级的应用,就不劳

【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)

现在基本都在Linux下工作学习了,在看英文书籍的时候往往需要查字典,但是网查的话一是点来点去非常麻烦,二是广告多烦死人,加上linux平台上没有不错的字典,于是就产生了做一个本地的命令行web字典来满足自己的需求. 感谢pycharm这个精彩的IDE和Python这个强大而简单的语言,1天时间内帮助我开发了全部的功能. shadowebdict的实现思路是这样的: 0.输入中文或者英文 1.去本地数据库寻找相应的结果并显示. 2.如果本地数据库不存在该单词,则去互联网中寻找答案并存入数据库.

【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)

承接上文. 我们采用自顶而下的方式开发,因此,今天就解决程序的主要架构:main.py的开发. 自顶而下的方式,意味着我们需要假设已经开发好了两个模块:一个是LocalDB,一个是WebDict.LocalDB存储已经在网上查过的单词,而WebDict则在新词出现时,从网上获取回相应的资料. 比如我要查process这个单词的意思,第一次是由WebDict模块返回的意思,但第二次查process就是由LocalDB完成了. 然后定义输入输出.鉴于模块和main架构之间已经解偶了,因此,就不着急进

Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesaw发布的博客中这样写道:“我们需要能够处理单播(unicast)和任播(anycast)虚拟 IP (VIPs) 流量,使用 NAT 和 DSR (也被称为 DR) 执行负载均衡,执行针对后端的健康检查.特别是,我们需要一个容易管理的平台,可以自动部署配置的变化.在评估了一些包括现有的开源项目的平台

基于linux操作系统Mysql的基本操作(三)

基于linux操作系统Mysql的基本操作(三) 知识点一:查看MYSQL数据库中所有用户 命令: select distinct concat ('User:''',user,'''@''',host,''';')as query from mysql.user; 注:(1)关键词 DISTINCT 用于返回唯一不同的值. 语法:SELECT DISTINCT 列名称 FROM 表名称 (2)SQL CONCAT函数用于将两个字符串连接起来,形成一个单一的字符串. 比较两者的用法: 知识点二:

[转载][献给想深入学习Linux开发的网友] Linux 应用程序开发到内核开发的简明指南

[献给想深入学习Linux开发的网友] Linux 应用程序开发到内核开发的简明指南. 前言,Linux/Unix 社区的版块不热闹,新手太多,高手太忙,偶把自己这几年的Linux学习的过程讲讲,希望能给大家有点帮助, 引导初学者学习的方向,少走弯路,事半功倍,同时也是抛砖引玉,请过来人热烈发言. 1. 首先熟悉 Linux  建议在 Windows 上安装 VMware Workstation 6.5.0(以下简称VM), 下载种子在 http://www.verycd.com上找. 安装好 

基于Linux的OJ系统的设计与开发(一)

最近在研究基于linux的OJ系统,然后想自己写一系列文章记录自己这段时间的学习成果. 首先,从原理上讲,OJ功能实现并不难,最主要解决的是安全性问题.总结一下,而安全性方面问题主要是用户可能提交恶意不友好的代码.关于如何过滤这些不安全的代码,我从网上收集整理了许多资料,大体上思路如下: 先说错误的做法: 1.所有的字符串过滤都是不靠谱儿的,坑人坑自己,C语言强大的宏几乎没有绕不过的字符串过滤,而且误伤也是很常见的,比如,你在程序里要是不小心定义一个叫做fork的变量,那么你的程序别指望可以AC

基于Linux的智能家居的设计(1)

写在前面:做了半年的毕业设计,找到的工作与这个完全无关,发现自己现在有写不甘心,但是我还是在关注这方面的发展,自己的摸索和前人的帮助我完成了智能家居的一部分,希望这个能够给一些初学者 能够一些便利,毕竟技术是一个开放的,不属于某一个人的. 摘要 本课题主要目的是设计和实现一个基于Linux开发平台的智能家居系统.本系统主要使用PVC板做成的家居模型.本系统硬件使用基于ARM架构的samsung S3C6410芯片做成的OK6410开发板为手持终端,利用Zigbee实现网络通讯,并结合各种电子元器

基于Linux的智能家居的设计(3)

2  硬件设计 本课题的硬件设计包括主控制器.数据传输设计.数据采集设计.控制驱动设计.显示设计,门禁设计. 2.1  主控制器 根据方案三选择S3C6410主控芯片,S3C6410是由Samsung公司推出的一款低功耗.高性价比的RSIC处理器 ,基于ARM11内核,内置强大的硬件加速,显示处理和缩放,运动视频处理,音频处理[9].这个作为智能家居的处理器是不二之选,硬件性能上完全可以实现.本设计选用的基于S3C6410的OK6410开发板.开发板上拥有如下特征[10]: (1)  12MHz