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

全系列目录:

  • 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)
  • 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)
  • 【原创】shadowebdict开发日记:基于linux的简明英汉字典(三)
  • 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)
  • 项目的github地址

承接上文。

现在来进行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 timeclass 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 worddef 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()breakexcept:passreturn fdef 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 = 0res = []while 1:second = label_itm.search(data, start_itm)if not second:breakword = self.get_sentence_from_dt(data[second.start('item'):second.end('item')])res.append(word)start_itm = second.end()return resdef 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'] = wordtmp_dict['times'] = 1res.append(tmp_dict)return resdef 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'] = -1net_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'] = -1sentence_start = 0sentence_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:breaksentence_lst.append(self.generate_sentence(sentence_str))sentence_start = sentence.end()res['sentence'] = "\n\n".join(sentence_lst)return resdef generate_explain(self, target):start_word = 0end_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:breakres += 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:breakres += '\n'start_word = end_labelreturn resdef generate_net_explain(self, target):start_itm = 0end_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:breakstart_itm = first.end()return resdef 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 resdef get_sentence_from_dt(self, target):res = ''length = len(target)index = 0while index < length:if target[index] == '<':while target[index] != '>':index += 1else:res += target[index]index += 1return resif __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, vprinttime.sleep(3)

 

转载于:https://www.cnblogs.com/shadowmydx/p/4335901.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机应用基础知道,谁知道计算机应用基础练习题的答案?

谁知道计算机应用基础练习题的答案&#xff1f;46&#xff0e;简述美籍匈牙利数学家冯诺依曼(Von Neumann)在1946年提出的关于计算机的体系结构和“程序存储”的设计思想。47&#xff0e;简要说明Windows98中安装存放在CD—ROM上的应用程序的操作过程。48&#xff0e;简述Windo…

springboot分页展示功能_springboot实现分页

这里项目是springboot&#xff0c;mybatis&#xff0c;thymeleaf&#xff0c;实现我自制的商城项目后台页面的分页功能。参考我之前总结的分页&#xff0c;简单的处理一下就可以了上代码首先写一个超链接跳转到controller层的方法商品管理然后写后台controller层代码/*** 后台商…

Delphi中的基础数据类型

参考http://www.cnblogs.com/del/archive/2007/12/04/982167.html 在学习之初&#xff0c;在这么多的数据类型中&#xff0c;最好记住这五种标准数据类型&#xff08;整型、实型、字符型、字符串型、布尔类型&#xff09;和这五种类型中的最常用的类型&#xff0c;其他类型在以…

计算机程序编辑器中文版,小说编辑器(Atomic Scribbler)

AtomicScribbler是一款功能强大的电脑小说编辑器&#xff0c;快速编辑、创作你的小说&#xff0c;也可以直接导入文本二次编辑&#xff0c;内置了丰富的文字编辑工具&#xff0c;完全能够满足日常创作小说、编辑文字使用需求。。相关软件软件大小版本说明下载地址AtomicScribbl…

信号与系统sa函数求积分_瞎扯数学分析微积分(1~4)

算法数学之美日期&#xff1a;2019年10月30日正文共&#xff1a;12013字0图预计阅读时间&#xff1a;31分钟来源:豆瓣 wxmang这一篇帖子主要介绍人类如何从一个基于几何直观或直觉的计算技巧或计算方法&#xff0c;进化到逻辑基础严密的公理体系的例子&#xff0c;想说明人类抽…

Cocos2D研究院之CCNode详解(三)

http://www.xuanyusong.com/archives/950 上一章我们了解了cocos2d的项目路径以及工作原理&#xff0c;这次作者要真刀真枪地讲解代码了&#xff0c;咱们先来看看cocos2d最常用、也是作者认为最核心的类——CCNode。 之前说过&#xff0c;cocos2d的所有类都以CC开头&#xff0c…

大一计算机导论期中考试,大一计算机导论试题

大一计算机导论试题1. 用一个字节表示无符号整数&#xff0c;其最大值是十进制数( )。A. 256 B. 255 C. 127 D. 1282. 一个完整的计算机系统应包括( )。A. 运算器、控制器和存储器 B. 主机和应用程序C. 硬件系统和软件系统 D. 主机和外部设备3. 微机中的CPU是指( )。A. 内存和运…

eplan怎样创建和修改图框_EPLAN标题页及图框的设计

标题页理解为特殊的表格&#xff0c;选择“工具”--“主数据”--“表格”---“打开”&#xff0c;弹出“打开表格”对话框&#xff0c;文件类型“标题页/封页.f26”,选择需要打开的表格&#xff0c;点击打开按钮&#xff0c;表格中的元素&#xff1a;1.文本&#xff1a;表示普通…

计算机第二课堂教学计划,小学的第二课堂教学计划

小学的第二课堂教学计划开展内容丰富&#xff0c;形式多样的第二课堂活动&#xff0c;通过活动&#xff0c;使学生受到爱国主义及道德情感教育&#xff0c;掌握技能&#xff0c;全面提高他们的素质&#xff0c;使其成为全面发展的一代新人。下面是小编分享给大家的小学的第二课…

webstorm两个文件比对_webstorm怎么更改文件名称?或者是重命名

在开发的过程中&#xff0c;我们一个项目中会有很多的文件&#xff0c;每个文件中也会有很多的层级关系&#xff0c;有时候新建一个文件的时候&#xff0c;一不下心就会出错&#xff0c;位置出错我们可以移动更换位置&#xff0c;名称命名错误&#xff0c;我们可以重命名&#…

using

using关键字有两个主要用途&#xff1a; 作为指令&#xff0c;为命名空间创建别名或导入其他命名空间中的类型。作为语句&#xff0c;定义一个范围&#xff0c;在此范围的末尾将释放对象。using指令 using指令有两个用途&#xff1a; 导入其他命名空间中的类型&#xff1a;usin…

秒懂物理计算机出题规划,57张动图, 让你秒懂高中物理原理! 考试次次拿第一

原标题&#xff1a;57张动图, 让你秒懂高中物理原理! 考试次次拿第一物理不像语文或者英语&#xff0c;文科的东西记的东西偏多&#xff0c;理解的成分偏少&#xff0c;但物理理解的成分很重&#xff0c;要死记硬背的东西反而很少。要想把物理学好&#xff0c;先要把简单的概念…

matlab机器人自动分拣_极智嘉分拣系统落地 助力打造智慧物流引擎

全球AMR引领者极智嘉(Geek)近日宣布已为知名跨境电商企业棒谷科技(Banggood)部署全柔性智能AMR分拣系统,以支持棒谷科技日益增长的海外跨境电商业务需求。棒谷科技业务体系遍及全球200多个国家。随着电商业务的加速转变,棒谷科技的发展面临线上销售增长快、业务需求难以预测、劳…

$arr['id'],$arr[id]的区别

说白了区别就是当不加的时候我们首先会考虑的是这个id是不是一个常量 例如&#xff1a; define("abc",ABC); 那么实际上$arr[id] $arr[ABC]; 所以在这个过程中就会多加了一步操作。那么引申一个问题就是 在$arr取值时尽量使用单引号就会比直接写或者加双引号就会更快…

n分频器 verilog_时钟分频系列——分数分频电路的Verilog实现

IC君的第47篇原创文章上一篇文章时钟分频系列——偶数分频/奇数分频/分数分频&#xff0c;IC君介绍了各种分频器的设计原理&#xff0c;其中分数分频器较为复杂&#xff0c;这一篇文章IC君再跟大家聊聊分数分频的具体设计实现。一个分数分频器由两部分组成&#xff1a;以ZN和ZN…

通过gdb调试分析Linux内核的启动过程

作者&#xff1a;吴乐 山东师范大学 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、实验流程 1.打开环境 执行命令&#xff1a;cd LinuxKernel/ 执行命令&#xff1a;qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img M…

清除服务器上传队列的文件,webUploader上传demo

最近&#xff0c;要做文件上传功能&#xff0c;在同事推荐下&#xff0c;选择了webUploader插件。WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主&#xff0c;FLASH为辅的现代文件上传组件&#xff0c;详情请看官网(直接百度webUploader&#xff0c;应该是第…

HappyLeetcode64:Sqrt(x)

Implement int sqrt(int x). 这道题本质上是求sqrt(x)下最大的整数。二分查找是比较容易想到的方法。另&#xff0c;在网上又学习了下别人的牛顿迭代法。 这是我原来的写法&#xff0c;写入是错误的&#xff0c;复杂度太高 class Solution { public:int sqrt(int x) {if (x <…

德云斗笑社何九华为什么没参加_狗狗的身体卡在了门上,女主人低头一看忍不住笑了:这是膨胀了...

大家应该有看过长得像煤气罐一样体型圆圆的狗狗吧&#xff1f;它们可能是因为疾病导致的&#xff0c;也可能是被主人喂得过于肥胖了。这个故事中的狗狗被过分宠溺&#xff0c;才短短的几个月&#xff0c;它居然画风突变&#xff0c;不禁想问这是去参加宠物变形记了吗&#xff1…

服务器绑定域名可修改吗,云服务器可以绑定域名吗

云服务器可以绑定域名吗 内容精选换一换访问IIS搭建的网站不通&#xff0c;报错404。IIS上绑定的域名只填写了主机名&#xff0c;没有指定IP地址。本节操作指导用户修改IIS上绑定的域名&#xff0c;以Windows Server 2008 R2操作系统云服务器为例。登录服务器&#xff0c;选择“…