栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

Python实现谷歌翻译爬虫,翻译PDF,翻译Excel,支持excel文档打开翻译,支持xlsx,xlsm等格式。

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python实现谷歌翻译爬虫,翻译PDF,翻译Excel,支持excel文档打开翻译,支持xlsx,xlsm等格式。

前言:

这两个Python脚本是我在实习期间完成的,具体来自于小组主管的两个小需求。做完之后感觉还是挺有收获的。

实现谷歌翻译,首先需要将我们写的Python脚本还有需要翻译的文件放到谷歌浏览器的安装目录下。

值得注意的是,实现谷歌翻译需要调用谷歌浏览器驱动chromedriver.exe,如果没有则需要去下载并将其放入谷歌浏览器的安装目录下。致于如何下载对应浏览器版本的驱动可以百度参考一下!

以下分别两个说明,指明了使用方法。

翻译pdf-txt-word的实现:

说明1

本爬虫主要实现如下功能:
       首先将pdf文件转换为txt文件,然后从txt文件中读取每一行进行爬虫翻译。翻译完后将每行的原文与翻译结果写入word(.doxc)文件中,翻译结束保存并退出。

使用方法及注意事项:

  1. 首先,将需要翻译的pdf文件放入translate_pdf_to_text_to_word.exe 相同的路径下。
  2. 双击translate_pdf_to_text_to_word.exe 开始运行。
  3. 等待片刻,会在命令窗口提示如下信息:“请确认是否开始将pdf文件转化txt文件!(确认请按 1 ;直接开始翻译请按 2 ;退出请按 3)”
  4. 如果没有txt文件的话,需要先按下 1 生成txt文件。值得注意的是:一般生成的txt文件中一句话会被分成几段,这就需要我们手动打开txt文件对其段落格式进行调整。
  5. 按完 1 后,会提示如下信息:“请确认是否开始翻译(--2--开始/--3--结束)”
  6. 按下 y 后就开始进行爬虫(谷歌)翻译了;按下 3 后就结束本程序。

主要实现流程如下:

import sys
import pdfplumber
import os
import glob
import codecs
import docx
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from retry import retry
import time
import pynput.keyboard as pk

os.chdir('./')

chrome_options = Options()
# 可以选择是否需要隐藏浏览器界面
chrome_options.add_argument('--headless')
# 当前文件所在路径
path_c = os.getcwd()
# 拼接当前谷歌浏览器路径
path = path_c + 'Chromechromedriver.exe'
# 人为选择,默认直接指定驱动位置,可以看到浏览器工作状态,不需要添加环境变量
browser = webdriver.Chrome(path)
# 人为选择,隐藏浏览器工作状态,不过需要添加环境变量
# browser = webdriver.Chrome(chrome_options=chrome_options)
base_url = 'https://translate.google.cn/?sl=auto&tl=zh-CN&op=translate'
browser.get(base_url)

@retry(tries=3, delay=1)
def Google_translate(origin_contents):
    if origin_contents == '':
        return ''
    else:
        try:
            browser.find_element_by_css_selector(
                "textarea[aria-label='原文']").clear()  # 清空输入框内的提示信息,如果直接输入内容,可能会与输入框的默认提示信息拼接,从而造成输入信息的错误
            browser.find_element_by_css_selector(
                "textarea[aria-label='原文']").send_keys(origin_contents)  # 用于在一个输入框内输入内容

            time.sleep(2)  # 此处需根据网络情况来进行延时,因为填入文段需要一定时间才能获取到网络的翻译结果
            dst_text = browser.find_element_by_xpath(
                '//*[@id="yDmH0d"]/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[7]/div/div['
                '1]/span[1]').text
        except:
            print('原文可能有误,默认返回原文')
            return origin_contents
    return dst_text

# pdf文件转为txt文件
def pdf_txt():
    for file in glob.glob(r'*.pdf'):
        print(file)
        pdf = pdfplumber.open(file)
        page_count = len(pdf.pages)
        f = codecs.open(os.path.basename(file)[:-4] + '.txt', 'w', 'utf-8')  # 若文件不存在,系统自动创建。'a'表示可连续写入到文件,保留原内容,在原
        # 内容之后写入。可修改该模式('w+','w','wb'等)
        print(page_count)  # 得到页数
        for page in pdf.pages:
            print('---------- 第[%d]页 ----------' % page.page_number)
            f.write('---------- 第[' + str(page.page_number) + ']页 ----------' + 'n')
            # 获取当前页面的全部文本信息,包括表格中的文字
            print(page.extract_text())
            translate = page.extract_text()
            f.write(translate)  # 将字符串写入文件中
        f.close()  # 关闭


# 将生成的txt文件内容进行翻译
def txt_translate():
    for filename in glob.glob(r'*.txt'):
        print(filename)
        with codecs.open(filename, 'r', 'utf-8') as f:
            file = docx.Document()  # 创建内存中的word文档对象
            data = f.readlines()

            for index in data:
                write_origin = index.replace("n", "")
                print(write_origin)

                Results = Google_translate(write_origin)  # 谷歌翻译

                print(Results)
                file.add_paragraph(index + Results)  # 写入若干段落

        f.close()  # 关闭
        file.save(os.path.basename(filename)[:-4] + '_Translate.docx')

    print('Translate complete!!!n')
    # os.system('pause')
    sys.exit()


# 键盘监听事件y
print("nnn")
print("请确认是否开始将pdf文件转化txt文件!(确认请按 1 ;直接开始翻译请按 2 ;退出请按 3)")


def on_press(key):
    # 监听按键
    key = str(key)[1]
    if key == "1":
        print("nnn")
        print("按键为", key)
        print("开始将pdf文件转化为txt文件!!!")
        pdf_txt()
        print("已生成txt文件!!!")
        print("请确认是否开始翻译(--2--开始/--3--结束)")
        print("为确保翻译准确,请打开生成的txt文件,调整段落,再进行翻译!")
    elif key == "2":
        print("nnn")
        print("按键为", key)
        print("开始翻译!!!")
        print("请耐心等待!!!")
        txt_translate()
    elif key == "3":
        print("nnn")
        print("按键为", key)
        print("取消翻译!!!")
        sys.exit(0)
    else:
        print("按键为", key)


# 连接事件以及释放
with pk.Listener(on_press=on_press) as pklistener:
        pklistener.join()
        time.sleep(3)


翻译Excel的实现:

说明2

本爬虫主要实现如下功能:
       本爬虫实现对excel文件单元格内容进行翻译,可以对excel文件直接进行翻译,也可以将pdf文件中的表格转化为excel,再进行翻译。支持excel文档打开翻译,支持xlsx,xlsm等格式的excel文件。

使用方法及注意事项:

  1. 首先,将需要翻译的pdf文件或者excel文件放入pdf_to_excel.exe和translate_for_excel.exe相同的路径下。
  2. 双击pdf_to_excel.exe 可以对路径下的pdf进行转换,转换为excel,会生成ans.xlsx文件。
  3. 双击translate_for_excel.exe实现对ans.xlsx文件或其他需要翻译的excel文件进行翻译。
  4. 双击translate_for_excel.exe后,控制台输出“请输入需要翻译的表格(Sheet):”,输入需要翻译的Sheet。之后控制台会输出“请输入需要翻译的文本范围,数字之间用空格分隔开:”,输入需要翻译的范围,注意这里要输入四个数字来确定单元格的范围,四个数字分别代表“第几行 第几列 第几行 第几列”。
  5. 之后控制台会输出“请输入翻译后的存放范围,数字之间用空格分隔开:”,注意这里要输入四个数字来确定要存放翻译内容单元格的范围。
  6. 注意:当谷歌翻译窗口一直显示在加载,但实际上已经加载完了,这需要点击窗口的×取消加载。然后直接在控制台输入需要翻译的sheet,以及范围。
from openpyxl import load_workbook
import xlwings as xw
import os
import sys
import glob
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from retry import retry
import time

os.chdir('./')

# 从指定文件路径读取excel文件和Sheet表格
chrome_options = Options()
# 可以选择是否需要隐藏浏览器界面
chrome_options.add_argument('--ignore-certificate-errors')
# 当前文件所在路径
path_c = os.getcwd()
# 拼接当前谷歌浏览器路径
path = path_c + 'Chromechromedriver.exe'
# 人为选择,直接指定驱动位置,可以看到浏览器工作状态,不需要添加环境变量
browser = webdriver.Chrome(path)
base_url = 'https://translate.google.cn/?sl=auto&tl=zh-CN&op=translate'
browser.get(base_url)


# @retry(tries=3, delay=1)
def Google_translate(origin_contents):
    dst_contents = []
    for index in origin_contents:
        if index == "":
            dst_contents.append("")
        else:
            print(index)
            browser.find_element_by_css_selector(
                "textarea[aria-label='原文']").clear()
            browser.find_element_by_css_selector("textarea[aria-label='原文']").send_keys(index)  # 用于在一个输入框内输入内容
            time.sleep(3)  # 此处需根据网络情况来进行延时,因为填入文段需要一定时间才能获取到网络的翻译结果
            dst_text = browser.find_element_by_xpath(
                '//*[@id="yDmH0d"]/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[7]/div/div['
                '1]/span[1]').text
            print(dst_text)
            dst_contents.append(dst_text)
    return dst_contents


def Get_path():
    for file in glob.glob(r'*.xlsx') or glob.glob(r'*.xlsm'):
        load_workbook(file)
        print(file)
        return file  # 应为Sheet的原因,一次只能翻译一个文件


def Get_table():
    return input("请输入需要翻译的表格(Sheet):nn")


origin_list = []
dest_list = []


def Get_contents(file_path, sheet_index, x_start, y_start, x_end, y_end):
    contents = []
    try:
        wb = load_workbook(file_path)
    except:
        print("错误:打开文件失败,请检查文件路径是否有误!!!nn")
        sys.exit()
    try:
        sheet = wb.get_sheet_by_name(sheet_index)
    except:
        print("错误:打开sheet表格失败,请检查表名是否有误!!!nn")
        sys.exit()
    for i in range(x_start, x_end + 1):
        for j in range(y_start, y_end + 1):
            try:
                if sheet.cell(i, j).value is None:
                    contents.append("")
                else:
                    old = sheet.cell(i, j).value
                    contents.append(old)
            except Exception as e:
                print('写入时发生错误:' + e)
    print(len(contents))
    return contents


def Write_contents(path_t, sheet_num, ocontents, contents, x_start, y_start, x_end, y_end):
    index = 0
    workbook = xw.Book(path_t)
    sheet = workbook.sheets(sheet_num)
    for i in range(x_start, x_end + 1):
        for j in range(y_start, y_end + 1):
            if (origin_start_row == dest_start_row) and (origin_start_col == dest_start_col):
                sheet.cells(i, j).value = str(ocontents[index]) + 'n' + str(contents[index])  # 后面追加
            else:
                sheet.cells(i, j).value = str(contents[index])
            index += 1
    workbook.save(path_t)
    print('写入成功')


if __name__ == '__main__':
    path_t = Get_path()
    table = Get_table()
    print("如果文本范围相同,则会在原来的文本后添加nn")
    origin_start_row, origin_start_col, origin_end_row, origin_end_col = 
        map(int, input("请输入需要翻译的文本范围,数字之间用空格分隔开:nn").split(" "))
    dest_start_row, dest_start_col, dest_end_row, dest_end_col = 
        map(int, input("请输入翻译后的存放范围,数字之间用空格分隔开:nn").split(" "))
    # 从1开始
    origin_list = Get_contents(path_t, table, origin_start_row, origin_start_col, origin_end_row, origin_end_col)
    print(origin_list)
    # 谷歌翻译
    dest_list = Google_translate(origin_list)
    # 从1开始,第几行第几列
    Write_contents(path_t, table, origin_list, dest_list, dest_start_row, dest_start_col, dest_end_row, dest_end_col)
print('Translate complete!!!')
browser.close()

希望以上面内容能给大家带来帮助,如果有用请点赞支持!!!感谢!!!

转载请联系!

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038759.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号