为了方便查单词的需要,利用python编写了一个翻译的小程序。
需要pip 安装 requests 和 beautifulsoup,打包要安装pyinstaller
目录
实现原理:
通过request请求http://www.youdao.com/w/查询词网址查询有道翻译的结果,
利用beautifulsoup从返回的网页中提取查询结果,
使用tkinter编写简单的界面实现控制。
最后加上图标使用pyinstaller打包成一个exe文件方便使用
软件界面:
编程实现过程:
request请求:
得到查询网址:
import requests
import time
base_url = 'http://www.youdao.com/w/'#查询网址
word = input()#word是要查询的词
url = base_url + word
请求网址获取翻译结果网页,请求失败自动重试:
success = False
failCount=0
while(not success and failCount<10):
try:
r = requests.get(url)
#print(r.status_code) # 获取返回状态
html = r.text #保存网页
success = True
except:
print("请求异常,重试中.")
success = False
failCount += 1
time.sleep(0.2) #延时0.2s后重试
数据处理:
得到网页翻译结果显示区内容:
soup = BeautifulSoup(html,'html.parser')
result = soup.find("div",{"class":"trans-container"})#根据网页结构获取翻译区内容
x = str(result)
print(x)#查看翻译区内容
将结果html分析转成列表:
soup = BeautifulSoup(x,'html.parser')
#EN to CH英文转中文
transList = list(map(lambda x:x.getText(),soup.findAll("li")))
#CH to EN中文转英文
if(len(transList)==0):
transList = list(map(lambda x:x.getText(),soup.findAll("p")))
if transList[-1] == "论文要发表?专家帮你译!":#删除广告
界面:
使用tkinter设计界面具体设计见源码,使用了Entry输入,按钮开始翻译,Listbox进行结果显示,使用一个变量hidden记录,Listbox调用pack和forget完成界面的展开与收回。
实现输入框回车进行查询的语句:
def send(event=None):
pass#这里写查询过程
inputEntry = Entry()
inputEntry.bind('<Return>',send)#绑定回车与send自定义方法,send是执行查询的方法
源码:
#http://www.youdao.com/w/查询词
import requests
#import urllib.request
import time
from bs4 import BeautifulSoup
from tkinter import *
root=Tk()
try:
root.iconbitmap('tr.ico')
except:
print("请在当前目录下放入tr.ico以显示图标")
root.title('在线翻译')
base_url = 'http://www.youdao.com/w/'
def send(event=None):
word = inputEntry.get()
url = base_url + word
print(url)
html = ''
success = False
failCount=0
while(not success and failCount<10):
try:
r = requests.get(url)
#print(r.status_code) # 获取返回状态
html = r.text
'''
r = urllib.request.urlopen(url)
html = r.read()
r.close()
'''
success = True
except:
print("请求异常,重试中.")
success = False
failCount += 1
time.sleep(0.2)
soup = BeautifulSoup(html,'html.parser')
result = soup.find("div",{"class":"trans-container"})
x = str(result)
print(x)
soup = BeautifulSoup(x,'html.parser')
#EN to CH
transList = list(map(lambda x:x.getText(),soup.findAll("li")))
#CH to EN
if(len(transList)==0):
transList = list(map(lambda x:x.getText(),soup.findAll("p")))
if transList[-1] == "论文要发表?专家帮你译!":#删除广告
del transList[-1]
v.set(transList)
listBox.pack(fill="x")
global hidden
hidden = False
htext.set("^")
def hideListBox():
global hidden
if(hidden):
listBox.pack(fill="x")
hidden = False
htext.set("^")
print(hidden)
else:
listBox.forget()
hidden = True
htext.set("v")
print(hidden)
upperFrame = Frame(root)
inputEntry = Entry(upperFrame,width=26,font=("DFKai-SB",12))
inputEntry.bind('<Return>',send)
sendButton = Button(upperFrame,text="翻译",command=send)
htext = StringVar()
htext.set("v")
hideButton = Button(upperFrame,textvariable=htext,command=hideListBox,width=3)
hidden = True
v=StringVar()
listBox = Listbox(root,listvariable=v,height=6)
inputEntry.pack(side="left",anchor="w",fill="x",padx="2")
hideButton.pack(side="right",anchor="ne",padx='2')
sendButton.pack(side="right",anchor="ne")
upperFrame.pack(fill="x")
root.mainloop()