利用python抓取指定格式数据并翻译
程序员文章站
2022-07-01 20:54:16
...
纪念我的第一个python动作
要实现的目标
- 给定properties文件,内容会有注释
- 匹配properties的value部分(“=”右边的),翻译出来
- value部分以.htm和.gif结尾的不需要翻译
- 文本中标签和标签中的内容不需要翻译,
- 翻译出来的value替换原来的value内容,输出成propertie文件
我的算法实现的基本思路
- 打开文件,匹配value部分,利用正则表达式,取出需要翻译的部分
- 将properties的key和翻译好的value部分结合写入目标文件(这部分我当时看见觉得真的挺简单的,但是越做坑越多)
遇见的问题及解决办法
- 首先正则匹配的时候遇见了问题 当匹配标签的时候当遇见例如
<div><div<p>this is my blog</P></div></div>
最开始我只是匹配’<’和‘>’,结果是<div>
后来了解到正则的贪婪模式与非贪婪模式,更改了一下正则的pattern,r'(.*?)<[a-zA-Z].*>(.*)</[a-zA-Z]>(.*).*'
,得出了正确结果; - 得到数据进行翻译,因为标签及内容是不需要翻译的,所以用到了re.match返回的对象的group方法,解决了部分翻译的难题;
- 我以为剩下只要调用接口翻一下就ok了,没想到最大的问题就在这。当我规规矩矩的在循环翻译接口时,(代码过于简单就不拿出来了)导出的结果却有惊喜
发现只有第一行被翻译出来了,于是我debug了一遍程序,发现结果决然是正确的,全部翻译。
去查找资料查到了这个yield from asyncio.sleep(1)
,以及下面这段代码。(原谅我找不到出处了,还是谢谢那位大牛),具体我也不知怎么回事,刚学python对线程不是很了解,希望有人可以来指导一下!万分感谢!这个弄好之后就结果正确啦!不过目前是一秒的间隔调用接口一次,效率有点低,也还等待解决。。。
def transalteEnToZh(content):
r = yield from asyncio.sleep(1)
globe.set_value('contentCh',baidu.baidu_translate(content))
# print(baidu.baidu_translate(content),end='')
def runEventLoop(content):
loop = asyncio.new_event_loop()
loop.run_until_complete(transalteEnToZh(content))
loop.close()
-此外,还用到了全局变量,代码如下
def _init():#初始化
global _global_dict
_global_dict = {}
def set_value(key,value):
""" 定义一个全局变量 """
_global_dict[key] = value
def get_value(key,defValue=None):
try:
return _global_dict[key]
except KeyError:
return defValue
python还是很好用的,希望能坚持学习下去,也希望大家多指点。
上一篇: arcpy提取文本文件中坐标
下一篇: 学习python
推荐阅读