diff --git a/addons21/fastwq/service/dict/eudict.py b/addons21/fastwq/service/dict/eudict.py new file mode 100644 index 0000000..06a7b56 --- /dev/null +++ b/addons21/fastwq/service/dict/eudict.py @@ -0,0 +1,126 @@ +#-*- coding:utf-8 -*- + +import base64 +import os +import re +import urllib.request as urllib2 + +from ..base import * + +css = '' +eudict_download_mp3 = True + + +@register([u'欧路词典', u'eudict']) +class Eudict(WebService): + def __init__(self): + super(Eudict, self).__init__() + + def _get_from_api(self): + url = 'http://dict.eudic.net/mdicts/en/{}'.format(self.quote_word) + try: + result = {} + html = self.get_response(url, timeout=5) + soup = parse_html(html) + + def _get_from_element(dict, key, soup, tag, id=None, class_=None): + baseURL = 'http://dict.eudic.net/' + # element = soup.find(tag, id=id, class_=class_) # bs4 + if id: + element = soup.find(tag, {"id": id}) + if class_: + element = soup.find(tag, {"class": class_}) + if element: + dict[key] = str(element) + dict[key] = re.sub(r'href="/', 'href="' + baseURL, + dict[key]) + dict[key] = re.sub(r'声明:.*。', '', dict[key]) + dict[key] = dict[key] + return dict + + def _sentence_audio(soup, tag, class_): + el_list = soup.findAll(tag, {'class': class_}) + if el_list: + url = 'https://api.frdic.com/api/v2/speech/speakweb?langid=ting&voicename={0}&txt=QYN{1}' + maps = [] + for element in el_list: + # 例句 + i_str = '' + m = element.find('div', {'class': 'content'}) + if m: + i_str = str(m) + # 声音 + sound = url.format( + element.get('source'), + urllib2.quote( + base64.b64encode(m.text.encode('utf-8')))) + maps.append([sound, i_str]) + my_str = '' + for i, e in enumerate(maps): + i_str = e[1] + sound = e[0] + mp3 = self._fld_mp3(sound) + my_str = my_str + '
  • ' + i_str + ' ' + mp3 + '
  • ' + return my_str + + result = _get_from_element( + result, 'phonitic', soup, 'span', class_='Phonitic') + result = _get_from_element( + result, 'fccf', soup, 'div', id='FCChild') # 西汉-汉西词典 + result = _get_from_element( + result, 'example', soup, 'div', id='LJChild') # 西语例句库 + result = _get_from_element( + result, 'syn', soup, 'div', id='SYNChild') # 近义、反义、派生词典 + result = _get_from_element( + result, 'ff', soup, 'div', id='FFChild') # 西西词典 + result['oexample'] = _sentence_audio( + soup, 'div', class_='lj_item') # 原声例句 + + return self.cache_this(result) + except Exception as e: + return {} + + def _fld_mp3(self, audio_url): + if eudict_download_mp3 and audio_url: + filename = get_hex_name('eudict', audio_url, 'mp3') + if os.path.exists(filename) or self.net_download( + filename, audio_url): + return self.get_anki_label(filename, 'audio') + return '' + + @export([u'真人发音', u'Real person pronounciation']) + def fld_sound(self): + url = 'https://api.frdic.com/api/v2/speech/speakweb?langid=es&txt=QYN{word}'.format( + word=urllib2.quote(base64.b64encode(self.word.encode('utf-8')))) + filename = get_hex_name(self.unique.lower(), url, 'mp3') + if os.path.exists(filename) or self.net_download(filename, url): + return self.get_anki_label(filename, 'audio') + return '' + + @export('PHON') + def fld_phonetic(self): + return self._get_field('phonitic') + + @export([u'英汉-汉英词典', u'English-chinese/Chinese-english']) + @with_styles(css=css) + def fld_fccf(self): + return self._get_field('fccf') + + @export([u'英语例句库', u'English examples']) + @with_styles(css=css) + def fld_example(self): + return self._get_field('example') + + @export([u'近义词词典', u'Synonyms']) + def fld_syn(self): + return self._get_field('syn') + + @export([u'英英词典', u'English-english']) + @with_styles(css=css) + def fld_ff(self): + return self._get_field('ff') + + @export([u'原声例句', u'Original examples']) + @with_styles(css=css) + def fld_oexample(self): + return self._get_field('oexample')