百度翻译实例:
import requests
import json
import sys
class BaiduFanyi:
def __init__(self,trans_str):
#将固定不变的数据放在初始化函数,可以在其他函数中传递。
#在__init__(self,trans_str)中的trans_str是在全局实例化类名后面可以添加的实参
self.trans_str = trans_str
self.lang_detect_url = "https://fanyi.baidu.com/langdetect" # 复制语言检测的url地址
self.headers={"User-Agent"="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}
def parse_url(self,url,data): #发送和接收post请求,传入data形参是因为post请求中,不仅需要带headers请求头,还需要带data请求体
response = requests.post(url,data=data,headers=self.headers)
return json.loads(response.content.decode())
# `response.content.decode()`对返回的bytes数据进行解码,默认是utf-8
#`json.loads()`是转换成json字典数据,而转化成js字典是因为最终的目的是取字典中lang键的值。
# 然后在<run>方法里拿到lang的值
def get_ret(self,dict_response):#提取翻译的结果
# 取response中的dst的值 >>>
# trans: [{dst: "Bye", prefixWrap: 0, result: [[0, "Bye", ["0|6"], [], ["0|6"], ["0|3"]]], src: "再见"}]
ret = dict_response["trans"][0]["dst"]
print("result is:",ret)
def run(self): #实现主要逻辑
#1.获取语言类型
#1.1 准备post的url地址:post_data
lang_detect_data = {"query":self.trans_str}
#1.2 第一次发送post请求,获取响应,获取当前语言类型
#1.3 提取语言类型
lang = self.parse_url(self.lang_detect_url,lang_detect_data)['lan']
#调用parse_url函数,返回的是一个字典{},在字典后加[key],可以取到对应的values
#2.准备post的数据,根据输入语言,判断当前应发送的data字典
#另外,Form Data不一定是固定不变的,还会有其他键值对,需要一同输入
trans_data = {"query":self.trans_str,"from":"zh","to":"en"} if lang=="zh" else {"query":self.trans_str,"from":"en","to":"zh"}
# self.trans_str 表示输入要翻译的内容,会在全局实例化类名后面的实参内添加。
#3.第二次发送post请求(这是真的post请求),获取响应,获取翻译结果,用parse_url方法返回的是字典
dict_response = self.parse_url(self.trans_url,trans_data) #
#4.提取数据,提取翻译的结果
self.get_ret(dict_response)
if __name__ == '__main__':
trans_str = sys.argv[1] #主要是可以在pyhton shell中 快速使用。
baidu_fanyi = BaiduFanyi(trans_str) #实例化类名,
baidu_fanyi.run()
知识链接:__init__初始化的作用 >>>>
知识链接:GET请求头和POST请求体的区别 >>>>
知识链接:python 函数学习之sys.argv[1] >>>>
知识点总结:
- 1.__init__函数中的属性变量作用:
- a.
__init__ (self,形参1,形参2,...)
: 如果传入形参,则在实例化类名后的括号内就不能为空,需要传入对应的实参数据; - b.__init__下的命名的变量,都是类中固定不变的变量,可以在类下的其他函数中传递,命名方法是:
self.变量1 = 变量1
;传递的变量是self.变量1
。
- a.
- 2.除了 初始化方法"init"和 实现主要逻辑的"run"方法外,为什么还要定义其他函数,如parse_url、get_ret等方法?
- 因为在run方法中定义这些函数可能会造成一个方法内的代码冗长,不利于识别代码的作用
- 当需要不同方法来实现不同操作时,定义其他函数,只需要在主逻辑函数中顺次添加即可。
- 3.if…else…的表达形式:
-
一般表达:
if a>3: b = 0 else: b = 1
-
简洁表达(推荐):
b = 0 if a>3 else b = 1
-