#はじめに
前回(https://qiita.com/syun_practice/private/63d2de6faef992bbad39) に引き続きseleniumで遊んでみます。csvファイルに書かれた文または語句を自動的にgoogle翻訳に掛け、それを同じcsvファイルに出力するプログラムを作成しました。seleniumとChromeDriverの導入は前回を参考にしてください。
#動作環境
Windows 10 Home (64bit)
python 3.8.7
ChromeDriver 87.0.4280.88
selenium 3.141.0
#ソースコード
import csv
from pathlib import Path
from selenium import webdriver
import time
#翻訳して出力を配列に格納する関数
def translate():
tmp=[]
for i in range(len(translate_list)):
#csv上から順に入力
before_in.send_keys(translate_list[i])
time.sleep(2)
#出力部を取得
after_out = driver.find_element_by_css_selector("span[jsname='W297wb']")
tmp.append(after_out.text)
before_in.clear()
return tmp
#csvファイルを開く
filepath = Path(r"翻訳したいcsvファイルのあるディレクトリの絶対パス")
csv_file = list(filepath.glob("*.csv"))
csv_file_op = csv_file.pop()
#csvファイルの一列目を2次元配列で読み込み
with open(csv_file_op,'r',encoding='utf-8-sig') as fp:
translate_list = list(csv.reader(fp))
print(translate_list)
#翻訳言語を選択
print("翻訳する前の言語を入力してください.(ex. 英語:en 日本語:ja 韓国語:ko 中国語:zh-CN")
before_lang = input()
print("翻訳した後の言語を入力してください.(ex. 英語:en 日本語:ja 韓国語:ko 中国語(簡体):zh-CN) 中国語(繁体):zh-TW")
after_lang = input()
#google翻訳をChromeで開く
driver = webdriver.Chrome(r"chromedriverの格納されているディレクトリの絶対パス/chromedriver.exe")
url = "https://translate.google.co.jp/?hl=ja&sl="+ before_lang +"&tl="+ after_lang +"&op=translate"
driver.get(url)
#2秒待機
time.sleep(2)
#入力部を取得
before_in = driver.find_element_by_xpath("//*[@id='yDmH0d']/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[1]/span/span/div/textarea")
ans_arr = translate()
#csv書き込み
with open(csv_file_op, 'w', encoding= 'utf-8-sig', newline= "") as fp2:
i=0
#結果と翻訳前を結合
for row in translate_list:
row.append(ans_arr[i])
i+=1
writer = csv.writer(fp2)
for k in translate_list:
writer.writerow(k)
#ブラウザ閉じる
driver.close()
#部分的に解説
#csvファイルの一列目を2次元配列で読み込み
with open(csv_file_op,'r',encoding='utf-8-sig') as fp:
translate_list = list(csv.reader(fp))
print(translate_list)
with 構文を使ってファイルを開いています。encodingはutf-8-sigとして下さい。sigを付けた理由はBOMありのcsvファイルを読み込むためです。(参考資料[1]を参照してください)また、list(csv.reader(fp))でcsvファイルの中身を2次元配列で得ています。これは後に翻訳後の結果と結合して一行に書き込むためです。
#翻訳して出力を配列に格納する関数
def translate():
tmp=[]
for i in range(len(translate_list)):
#csv上から順に入力
before_in.send_keys(translate_list[i])
time.sleep(2)
#出力部を取得
after_out = driver.find_element_by_css_selector("span[jsname='W297wb']")
tmp.append(after_out.text)
before_in.clear()
return tmp
翻訳する文字を入力し、翻訳結果を取得する関数です。翻訳したい文字列の配列を引数に渡して、forループで配列の長さ分だけ繰り返し翻訳をしています。google翻訳の翻訳結果の出力部はfind_element_by_css_selector("span[jsname='W297wb']")で取得しています。また、一回一回入力をクリアするためにclear()を実行しています。戻り値は出力結果を要素とした配列です。
with open(csv_file_op, 'w', encoding= 'utf-8-sig', newline= "") as fp2:
i=0
#結果と翻訳前を結合
for row in translate_list:
row.append(ans_arr[i])
i+=1
writer = csv.writer(fp2)
for k in translate_list:
writer.writerow(k)
書き込みのためにもう一度csvファイルをwith構文で開いています。この時、オプションでnewline=""とすることでcsvファイルの出力時に一行空くことを防いでいます。#以下のforループでは翻訳前と翻訳語の配列を結合しています。結合した配列を一行ずつ書き込むことで翻訳前と翻訳語を横並びで書き込めるようになっています。
#csvファイルの書式
翻訳したい文字列を一列目に書き込んでください。
例:
翻訳したい文字列 | 空欄 | 空欄・・・ |
---|---|---|
大学 | ||
東京 | ||
月 | ||
太陽 | ||
etc・・・ | ||
翻訳結果は次の列(2列目)に出力されます。 |
#おまけ
個人的に自動入力されていく様子が面白いのでHeadlessモードは使いませんでしたが、使うと少し処理が早くなるかも?・・・
#参考資料
以下のサイトを参考にさせていただきました。
[1]https://qiita.com/showmurai/items/60d32006d13512ffeaff
[2]https://note.nkmk.me/python-file-io-open-with/
[3]https://qiita.com/ryokurta256/items/defc553f5165c88eac95