您的位置:首页 > 运维架构 > Linux

让人头大的英语linux也能翻译 – Linux下Python实现有道词典[转]

2013-03-12 10:33 399 查看
原文地址 : http://www.cnblogs.com/nwf5d/archive/2011/11/20/2255674.html
最近发现,用Linux系统比Window的工作和学习效率高多了,做任何事情都更直接有效, 而且现在绝大部分应用都是基于WEB的;所以,以后尽量用Linux了. 以下是用Python脚本实现的有道词典. 当然是参考了大牛的代码, 其中有某些部分出了点问题, 一是正则匹配, 二是颜色输出.

  Python代码的主要流程:

a. 带输入查询词调有道的WEB API

b. 使用正则匹配得到翻译内容

c. 格式化输出结果, 若需要配置颜色, 增加相应的shell配色参数.

1. Python代码

#! /usr/bin/python
import re;
import urllib;
import urllib2;
import sys;
def debug():
xml = open("word.xml").read();
print get_text(xml);
print get_elements_by_path(xml, "custom-translation/content");
#print_translations(xml, False, False);

def get_elements_by_path(xml, elem):
if type(xml) == type(''):
xml = [xml];
if type(elem) == type(''):
elem = elem.split('/');
if (len(xml) == 0):
return [];
elif (len(elem) == 0):
return xml;
elif (len(elem) == 1):
result = [];
for item in xml:
result += get_elements(item, elem[0]);
return result;
else:
subitems = [];
for item in xml:
subitems += get_elements(item, elem[0]);
return get_elements_by_path(subitems, elem[1:]);

textre = re.compile("<\!\[CDATA\[(.*?)\]\]", re.DOTALL);
def get_text(xml):
#print 10*"..."+"\n"
match = re.search(textre, xml);
if not match:
return xml;
#print 40*"..."
#print match
#print 40*"..."
return match.group(1);

def get_elements(xml, elem):
p = re.compile("<" + elem + ">" + "(.*?)", re.DOTALL);
it = p.finditer(xml);
result = [];
for m in it:
result.append(m.group(1));
return result;

GREEN = "\033[1;32m";
DEFAULT = "\033[0;49m";
BOLD = "\033[1m";
UNDERLINE = "\033[4m";
NORMAL = "\033[m";
RED = "\033[1;31m"

def crawl_xml(queryword):
return urllib2.urlopen("http://dict.yodao.com/search?keyfrom=dict.python&q=" + urllib.quote_plus(queryword) + "&xmlDetail=true&doctype=xml").read();

def print_translations(xml, with_color, detailed):
#print xml;
original_query = get_elements(xml, "original-query");
queryword = get_text(original_query[0]);
custom_translations = get_elements(xml, "custom-translation");
print BOLD + UNDERLINE + queryword + NORMAL;
translated = False;

for cus in custom_translations:
source = get_elements_by_path(cus, "source/name");

print RED + "Translations from " + source[0] + DEFAULT;
contents = get_elements_by_path(cus, "translation/content");
if with_color:
for content in contents[0:5]:
print GREEN + get_text(content) + DEFAULT;
else:
for content in contents[0:5]:
print get_text(content);
translated = True;
yodao_translations = get_elements(xml, "yodao-web-dict");
printed = False;
for trans in yodao_translations:
webtrans = get_elements(trans, "web-translation");
for web in webtrans[0:5]:
if not printed:
print RED + "Translations from yodao:" + DEFAULT;
printed = True;
keys = get_elements(web, "key");
values = get_elements_by_path(web, "trans/value");
summaries = get_elements_by_path(web, "trans/summary");
key = keys[0].strip();
value = values[0].strip();
#summary = summaries[0].strip();
#lines = get_elements(summary, "line");
if with_color:
print BOLD +  get_text(key) + ":\t" +DEFAULT + GREEN + get_text(value) + NORMAL;
#for line in lines:
#    print GREEN + get_text(line) + DEFAULT;
#print get_text(summary) + DEFAULT;
else:
print get_text(value);
#print get_text(summary);
#translated = True;
#if not detailed:
#        break

def usage():
print "usage: dict.py word_to_translate";
def main(argv):
if len(argv) <= 0:
usage();
#debug();
sys.exit(1);
xml = crawl_xml("".join(argv));
print_translations(xml, True, False);
#print_translations(xml, True, True);
#print_translations(xml, False, False);

if __name__ == "__main__":
main(sys.argv[1:]);

2. 添加Shell脚本

#!/bin/bash
echo -n "input:";
while read input;
do
python dict.py ${input};
echo -n "input:";
done
全文完

 

原文地址 : http://www.cnblogs.com/nwf5d/archive/2011/11/20/2255674.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: