鱼C论坛

 找回密码
 立即注册
查看: 5569|回复: 40

[原创] 写了个升级版的有道词典

[复制链接]
发表于 2017-4-8 22:31:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
花了两个小时写了个升级版的有道词典,代码写的很乱(不是一般的乱)。。。
支持整句话的中英互译,
查询英语单词时可以查找:释义,近义词,同根词,音标,双语例句,网络词组,词根

最重要的一点
每次翻译过的词语或者句子程序会自动保存到本地(‘系统文件,勿删.sys’),第二次翻译是就可以实现离线翻译了
又正是因为这个原因,系统文件,勿删.sys这个文件会越来越大...

好了,废话不多说,好用不好用大家说了算!
show me the code!




游客,如果您要查看本帖隐藏内容请回复
po2.PNG
po3.PNG
po4.PNG

评分

参与人数 3荣誉 +5 鱼币 +15 贡献 +5 收起 理由
新手·ing + 5 支持楼主!
SixPy + 5 感谢楼主无私奉献!
~风介~ + 5 + 5 + 5 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-9 00:01:39 | 显示全部楼层
from urllib.request import *
from urllib.parse import *
import pickle as p
import json,re,os

class Translate:
    def __init__(self,key_words):
        #存放网址
        self.key_words = key_words
        self.url_1 = Request('http://dict.youdao.com/search?q=' + self.key_words + '&keyfrom=fanyi.smartResult')
        self.url_1.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
        
        self.url_2 = Request('http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=fanyi.logo')
        self.url_2.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36')
        self.url_list = [self.url_2,self.url_1]
        #为self.find_meaning 初始化
        self.date = {"type":'AUTO',
            'i':self.key_words,
            'doctype':'json',
            'xmlVersion':'1.8',
            'keyfrom':'fanyi.web',
            'ue':'UTF-8',
            'action':'FY_BY_CLICKBUTTON',
            'typoResult':'true'}
        self.date = urlencode(self.date).encode('utf-8')#编码
        #存放翻译结果
        self.translate_result = {self.key_words:{'meaning':[],
                                                 'pronunciation':{'英':'','美':''},
                                                 'serious_meaning':[],
                                                 'internet_phrase':{},
                                                 'synonym':{},
                                                 'conjugate':{},
                                                 'example_sentence':{}}}

    def _load(self):
        self.file = open('系统文件,勿删!.sys','rb')
        self.dict = p.load(self.file)
        self.file.close()
        return self.dict

    def _save(self):
        self.old = self._load()
        self.translate_result.update(self.old)
        self.file = open('系统文件,勿删!.sys','wb')
        dict = p.dump(self.translate_result,self.file)
        self.file.close()

    
    #在'http://fanyi.youdao.com/查找释义
    def _find_meaning(self):
        self.cc = json.loads(urlopen(self.url_list[0],self.date).read().decode())
        #查找翻译结果
        try:
            self.cc['smartResult']['entries'][1:]
        except KeyError:
            self.translate_result[self.key_words]['meaning'] = self.cc['translateResult'][0][0]['tgt']
        else:
            for i in self.cc['smartResult']['entries'][1:]:
                self.translate_result[self.key_words]['meaning'].append(i)
    #查找发音
    def _find_pronunciation(self):
        self.cc = re.findall('<span class="pronounce">英(?:\n|.)+?</span>',self.html)
        self.dd = re.findall('<span class="pronounce">美(?:\n|.)+?</span>',self.html)
        #英式
        self.a = str(self.cc[0]).find('[')
        self.b = str(self.cc[0]).find(']')
        self.translate_result[self.key_words]['pronunciation']['英'] = str(self.cc[0])[self.a:self.b+1]
        #美式
        self.a = str(self.dd[0]).find('[')
        self.b = str(self.dd[0]).find(']')
        self.translate_result[self.key_words]['pronunciation']['美'] = str(self.dd[0])[self.a:self.b+1]
        
    #查找详细的释义
    def _find_meaning_seriously(self):
        self.cc = re.findall(r'<div class="trans-container">(?:.|\n)+?</div>',self.html)
        self.dd = re.findall(r'<li>[^\\].+?</li>',str(self.cc))
        for each in self.dd:
            self.ee = []
            each = each.replace('<li>','')
            each = each.replace('</li>','')
            self.ee.append(each)
            
        self.translate_result[self.key_words]['serious_meaning'] = self.ee

    #查找网络短语
    def _find_internet_phrase(self):
        self.cc = re.findall(r'<p class="wordGroup collapse">(?:.|\n)+?</p>',self.html)
        self.dd = re.findall(r'<span(?:.|\n)+?</p>',str(self.cc))
        for i in self.dd:
            self.a = i.find('wordgroup')
            self.b = i.find('</a>',self.a)
            self.c = i.find('</span>',self.b)
            self.d = i.find('</p>',self.c)
            self.words = i[self.c+7:self.d]
            #去除所有不好看的字符
            self.words = self.words.replace(' ','')
            self.words = self.words.replace('\\','')
            self.words = self.words.replace('\n','')                               
            self.translate_result[self.key_words]['internet_phrase'][i[self.a+11:self.b]] = self.words

    #查找近义词
    def _find_synonym(self):
        self.cc = re.findall(r'<div id="synonyms".+>(?:.|\n)+?</div>',self.html)
        self.dd = re.findall(r'<li>.+?</li>',str(self.cc))
        self.ee = re.findall(r'syno">.+?</a>',str(self.cc))
        self.a = []
        for i in self.ee:
            self.a.append(i[6:-4])
        self.translate_result[self.key_words]['synonym'][self.dd[0][4:-5]] = self.a
        
    #查找同根词
    def _find_conjugate(self):
        if '同根词' in self.html:        
            #查找词根
            self.a = self.html.find('词根')
            self.a = self.html.find('relword',self.a)
            self.b = self.html.find('</a>',self.a)
            self.d = self.html[self.a+9:self.b]
            self.translate_result[self.key_words]['conjugate']['词根'] = self.d
            self.cc = re.findall(r'<p class="wordGroup">\n.+?<span class="contentTitle">\n.+?<a class="search-js" href="/w/eng/.+/#keyfrom=dict.basic.relword">.+?</a>\n.+?</span>\n.+?\n.+</p>',self.html[self.a:])
            for i in self.cc:
                self.a = i.find('relword')
                self.b = i.find('</a>',self.a)
                self.c = i.find('</a>')
                self.d = i.find('</p>',self.c)
                self.words = i[self.c+4:self.d]
                #去除所有不好看的字符
                self.words = self.words.replace(' ','')
                self.words = self.words.replace('\\','')
                self.words = self.words.replace('\n','')
                self.words = self.words.replace('</span>','')
                self.translate_result[self.key_words]['conjugate'][i[self.a+9:self.b]] = self.words

        
    #查找双语例句
    def _find_example_sentence(self):
        #英文
        self.cc = re.findall(r'<span id="src_._." onmouseover="hlgt\(\'#src_._.,#tran_._.\'\)" onmouseout="unhlgt\(\'#src_._.,#tran_._.\'\)">.+</span>',self.html)
        #释义
        self.dd = re.findall(r'<span id="tran.+.+</span>',self.html)
        self.ff = []
        self.ee = []
        for each in range(3):
            self.ff.append(re.findall(r'>.+?</span>',self.cc[each]))
            self.ee.append(re.findall(r'>.+?</span>',self.dd[each]))
            for i in self.ff:
                if i[2] == ' ':
                    self.ff.remove(i)
            for i in self.ee:
                if i[2] == ' ':
                    self.ee.remove(i)
                    
        #拼接为一句话
        for each in range(3):
            self.e = ''
            self.c = ''
            for i in self.ee[each]:
                self.e += i
            for b in self.ff[each]:
                self.c += b
            #去除不好看的字符
            self.e = self.e.replace('</span>','')
            self.e = self.e.replace('>','')
            self.e = self.e.replace('<','')
            self.e = self.e.replace('b','')
            self.e = self.e.replace('/','')
            self.c = self.c.replace('</span>','')
            self.c = self.c.replace('>','')
            self.c = self.c.replace('<','')
            self.c = self.c.replace('b','')
            self.c = self.c.replace('/','')
            #添加换行符
            self.e += '\n'
            self.c += '\n'
            self.translate_result[self.key_words]['example_sentence'][self.e] = self.c       
                
        

    def _output(self):
        #打印'meaning'
        if self.translate_result[self.key_words]['meaning'] != []:
            print('这个词的意思是: \n')
            for i in self.translate_result[self.key_words]['meaning']:
                if not isinstance(i,str):
                    print(i)
                else:
                    print(self.translate_result[self.key_words]['meaning'])
                    print('\n')
                    break
                
        #打印发音
        if self.translate_result[self.key_words]['pronunciation']['英'] != '':
            print('发音:\n')
            print('英式: %s' % self.translate_result[self.key_words]['pronunciation']['英'])
            print('美式: %s' % self.translate_result[self.key_words]['pronunciation']['美'])
            print('\n')
            
        #打印'serious_meaning'
        if self.translate_result[self.key_words]['serious_meaning'] != []:
            print('说专业一点,这个词的意思是:\n')
            for i in self.translate_result[self.key_words]['serious_meaning']:
                print(i)
            print(' ')
            
        #打印网络词组
        if self.translate_result[self.key_words]['internet_phrase'] != {}:
            print('相关的网络词组: \n')
            for each in self.translate_result[self.key_words]['internet_phrase'].items():
                print('%s ------ %s' % (each[0],each[1]))
            print('\n')
            
        #打印近义词
        if self.translate_result[self.key_words]['synonym'] != {}:
            print('这个词语的近义词是:\n')
            for each in self.translate_result[self.key_words]['synonym'].items():
                print(each[0])
                for i in each[1]:
                    print(i)
                print('\n')
                
        #打印同根词
        if self.translate_result[self.key_words]['conjugate'] != {}:
            for each in self.translate_result[self.key_words]['conjugate'].items():
                print('%s ------ %s' % (each[0],each[1]))
            print('\n')
            
        #打印双语例句
        if self.translate_result[self.key_words]['example_sentence'] != {}:
            print('例如:\n')
            for each in self.translate_result[self.key_words]['example_sentence'].items():
                print('%s ------ %s' % (each[0],each[1]))
            print('\n')
            print('------------------------------华丽的分割线-------------------------------')
            print('\n\n')

    #程序从这里开始运行
    def start(self):
        self.old_dict = self._load()
        if self.key_words not in self.old_dict:
            try:
                #'http://dict.youdao.com/search?q=' + self.key_words + '&keyfrom=fanyi.smartResult' 返回值
                self.html = self.html = urlopen(self.url_list[1]).read().decode()
                #在'http://fanyi.youdao.com/查找释义
                self._find_meaning()
                #查找发音
                self._find_pronunciation()
                #查找详细的释义
                self._find_meaning_seriously()
                #查找网络短语
                self._find_internet_phrase()
                #查找近义词
                self._find_synonym()
                #查找同根词
                self._find_conjugate()
                #查找双语例句
                self._find_example_sentence()
                #保存
                self._save()
                #打印
                self._output()
            except:
                self._find_meaning()
                self._save()
                self._output()
                
        else:
            self.translate_result = self.old_dict
            self._output()

def look_all():
    file = open('系统文件,勿删!.sys','rb')
    dict = p.load(file)
    file.close()
    for each in dict.keys():
        print(each)

def go(words):
    url = 'http://dict.youdao.com/search?q=' + words + '&keyfrom=fanyi.smartResult'
    os.system('start %s' % url)

def restart():
    while True:
        key_words = input('请输入需要翻译的内容:【输入0退出:】 ')
        if key_words == '':
            print('你什么也不输入我也退出>_<')
            break
        if key_words != '0':
            cc = Translate(key_words)
            cc.start()
        else:
            print('谢谢使用!')
            print('程序退出...')
            break
    


if __name__ == '__main__':
    restart()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 00:02:59 | 显示全部楼层
原来是老司机,失敬失敬 —— 代码写得很漂亮,足以见得功力深厚!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 00:06:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 01:00:43 | 显示全部楼层
用什么写的~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 08:24:15 | 显示全部楼层
一定要看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 08:26:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 10:38:58 | 显示全部楼层
            self.e = self.e.replace('</span>','')
            self.e = self.e.replace('>','')
            self.e = self.e.replace('<','')
            self.e = self.e.replace('b','')
            self.e = self.e.replace('/','')
            self.c = self.c.replace('</span>','')
            self.c = self.c.replace('>','')
            self.c = self.c.replace('<','')
            self.c = self.c.replace('b','')
            self.c = self.c.replace('/','')

写成循环好点吧,可以重用。

@~风介~ 调皮的介哥~。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 12:32:55 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-9 12:43:03 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 13:52:38 From FishC Mobile | 显示全部楼层
~风介~ 发表于 2017-4-9 00:02
原来是老司机,失敬失敬 —— 代码写得很漂亮,足以见得功力深厚!

哪里哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-9 13:53:37 From FishC Mobile | 显示全部楼层
SixPy 发表于 2017-4-9 01:00
用什么写的~

python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 20:04:29 | 显示全部楼层
看看怎么写的,学习下,支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 21:38:57 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-9 22:31:54 | 显示全部楼层
MSK好厉害。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-9 23:12:59 | 显示全部楼层
加个gui是更好滴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 07:12:38 | 显示全部楼层
看看大神们的作品
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-10 14:08:23 From FishC Mobile | 显示全部楼层
因为在学校准备中考来不及一一回复,抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-10 17:27:40 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-10 17:31:35 | 显示全部楼层
完美运行,不错,向上面说的加个GUI更好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表