欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用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了,没想到最大的问题就在这。当我规规矩矩的在循环翻译接口时,(代码过于简单就不拿出来了)导出的结果却有惊喜
    利用python抓取指定格式数据并翻译
    发现只有第一行被翻译出来了,于是我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还是很好用的,希望能坚持学习下去,也希望大家多指点。