Traduisez automatiquement DeepL en anglais avec Python et Selenium

Chose que tu veux faire

Pour le moment, j'ai obtenu des informations bibliographiques + Abst de Science Direct. Ensuite, j'aimerais traiter cela en le versant dans DeepL et en le traduisant. Si vous vous inscrivez à un forfait payant, vous pouvez traduire les fichiers à la fois, mais bon, c'est un défi de l'essayer avec selenimu et chromedriver.

Préparation

Pour le moment, chargez le fichier CSV dans python.

import pandas as pd

df = pd.read_csv("DB.csv",header=None, delimiter=",", quoting=1)
print(df.at[0,1])  #Titre
print(df.at[0,9])  #Abst
print(df.at[0,10]) #mot-clé

for title in df[1]:
    print(title)

Eh bien, c'est lisse.

Accédez à DeepL avec Selenium et Chrom Driver

from selenium import webdriver  

load_url = "https://www.deepl.com/ja/translator"
driver = webdriver.Chrome(executable_path='c:/work/chromedriver.exe')  #  driver = webdriver.Chrome()
driver.get(load_url)

Cela se passe bien ici aussi.

Envoyer l'anglais à DeepL

En envoyant du texte et en obtenant une traduction, recherchez le sélecteur css de la zone de texte pour saisir des phrases en anglais et la zone de texte pour la sortie de la traduction à partir de l'écran du développeur de Chrome. Donc, l'entrée est fluide,

#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--source > div.lmt__textarea_container > div > textarea

Il s'est avéré que. Alors

title = df.at[0,1]
input_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--source > div.lmt__textarea_container > div > textarea"
driver.find_element_by_css_selector(input_selector).send_keys(title)

Honnêtement, j'ai envoyé l'anglais à DeepL.

Acquisition de la traduction japonaise Partie 1

D'autre part, la sortie s'adapte mieux. Pour le moment, une fois que j'ai fait une traduction dans une phrase anglaise appropriée et que je l'ai sortie, j'ai recherché et recherché sur l'écran du développeur en utilisant le texte de sortie, mais il n'a pas été entré tel quel dans la zone de texte, mais une balise de bouton a été attachée Est affiché. J'ai essayé d'obtenir l'élément bouton et de prendre le texte, mais je n'ai pas pu l'obtenir pour une raison quelconque. Même si vous regardez l'état de la variable avec le débogueur VSCode, le texte de l'élément est vide. e? Pourquoi? ?? Je peux le voir sur Chrome et sur l'écran du développeur, la traduction s'affiche correctement entre les balises de bouton, mais pourquoi est-ce un caractère vide? ??

Pour le moment, comme solution de contournement, DeepL dispose d'un bouton pratique qui copie la traduction dans le presse-papiers, je vais donc cliquer dessus avec Selenium pour le copier dans le presse-papiers et obtenir la traduction dans le presse-papiers. Alors, installez le package pyperclip pour gérer le presse-papiers, trouvez le sélecteur CSS du bouton qui copiera dans le presse-papiers, et écrivez le script suivant et exécutez-le.

import pyperclip

title = df.at[0,1]
input_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--source > div.lmt__textarea_container > div > textarea"
driver.find_element_by_css_selector(input_selector).send_keys(title)

time.sleep(5)

OutputCopyBtn = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__target_toolbar.lmt__target_toolbar--visible > div.lmt__target_toolbar__copy > button"
driver.find_element_by_css_selector(OutputCopyBtn).click()

print(pyperclip.paste())

Hmmm, je l'ai.

Acquisition de la traduction japonaise Partie 2

J'ai l'impression d'avoir perdu, alors je vais réessayer si je peux obtenir le texte directement à partir de l'élément bouton. Quand j'ai cherché sur Google, je suis tombé sur l'article de @ riikunn1004. Je vois. Peut-il être pris parce qu'il s'appelle .getAttribute (" textContent ")? Je peux le voir à l'écran, et je ne sais pas pourquoi je ne peux pas l'obtenir même si je peux le voir sur l'écran du développeur, mais j'ai essayé de créer le script suivant en référence à cela.

Output_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__translations_as_text > p > button.lmt__translations_as_text__text_btn"
Outputtext = driver.find_element_by_css_selector(Output_selector).get_attribute("textContent")
print(Outputtext)

Confirmez qu'il peut être pris avec cela. Huh.

prime

J'ai vérifié un peu plus la structure de la page Deep L. Zone de texte de sortie ainsi que zone de texte d'entrée

#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__inner_textarea_container > textarea

Il est spécifié par. Cependant, quand je regarde CSS, : disabled est attaché et l'opération est désactivée. En fait, la zone de sortie ne peut pas être sélectionnée avant de saisir du texte anglais. Donc, si vous entrez l'anglais, le nom de la classe dans cette zone changera et la désactivation disparaîtra. (Le sélecteur css ne change pas.)

Mais y a-t-il une traduction dans ce domaine? Cela n'est pas inclus. Il semble qu'il y ait une traduction à l'écran, mais elle reste vide à ce stade.

Si vous cliquez sur cette zone avec la souris et que vous vous concentrez sur la zone de texte, les éléments suivants apparaîtront et la traduction sera affichée. (Au fait, je suis entré dans le test en anglais, donc je ne le traduis pas.)

<div class="lmt__textarea_base_style" 
  style="
    position: absolute; transform: translate(-500%, -500%); 
    padding: 16px 32px 80px 24px; margin: 0px; overflow: hidden; font-family: &quot;
    Open Sans&quot;, sans-serif; font-size: 24px; font-stretch: 100%; font-weight: 400;
    line-height: 36px; height: 468.5px; width: 448.5px;">
  <span style="outline: green solid 1px;">Shiken</span>
  <span style="outline: red solid 1px; display: inline-block; position: relative; height: 1em;"></span>
  <span style="outline: blue solid 1px;"></span>
</div>

Sélecteur CSS de ce type

#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__inner_textarea_container > div

Hmmm, j'ai en quelque sorte compris. En d'autres termes, la page de DeepL s'affiche à l'écran lorsque du texte en anglais est saisi, mais elle n'est pas affichée dans la zone de texte.

En fait, dans la partie inférieure, comme ça

<button class="lmt__translations_as_text__text_btn">Shiken</button>

Je l'ai caché. Donc, si vous amenez le curseur à l'endroit qui ressemble à la "zone de texte" de la sortie à l'écran et appuyez sur le clic, l'élément div ci-dessus sera développé et la traduction sera affichée. Cela signifie-t-il que c'est un élément de bouton pour effectuer ce changement?

C'est assez compliqué. Pourquoi tu fais ça comme ça? ?? Cependant, je vois. Avec ce type de structure, vous ne pouvez pas trouver une traduction en regardant autour de la zone de texte à moins que vous ne cliquiez une fois sur la partie qui ressemble à une "zone de texte". De plus, le bouton est fondamentalement désactivé ou invisible, il ne peut donc pas être pris avec .text. De plus, même si vous obtenez le sélecteur CSS de l'élément qui apparaît lorsque vous vous concentrez dessus à l'avance et essayez d'y accéder après avoir fait une traduction, à moins que vous ne vous concentriez une fois sur la zone de texte, il sera lu comme "Il n'y a pas de tel élément" .. Concentrez-vous juste une fois et vous trouverez l'élément, donc je pense que vous pouvez l'obtenir.

Vraiment, pourquoi faites-vous une chose si compliquée? ??

~~ Final ~~ Code source

Pour le moment, la partie qui est envoyée à DeepL pour traduire automatiquement des phrases en anglais est la suivante. L'instruction while au milieu prend du temps pour traduire la phrase anglaise, c'est donc à cause du temps d'attente. Allez vérifier toutes les secondes pour voir si la traduction a réussi et interrompre si la traduction est terminée.

import pandas as pd
import time
from selenium import webdriver  #  
import chromedriver_binary

df = pd.read_csv("Reliablity EngineeringDB.csv",header=None, delimiter=",", quoting=1)

df.columns=["Authors", "Title", "jTitle", "VolIssue","Year", "Pages", "ISSN","DOI","URL","Abst","Keywords"]
print(df)

Title.df.at[0,1]

load_url = "https://www.deepl.com/ja/translator"
driver = webdriver.Chrome()  #  driver = webdriver.Chrome("c:/work/chromedriver.exe")
driver.get(load_url)

input_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--source > div.lmt__textarea_container > div > textarea"
driver.find_element_by_css_selector(input_selector).send_keys(Title)
while 1:
    Output_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__translations_as_text > p > button.lmt__translations_as_text__text_btn"
    Outputtext = driver.find_element_by_css_selector(Output_selector).get_attribute("textContent")
    if Outputtext != "" :
        break
    time.sleep(1)
print(Outputtext)

Fonctionnalisation

J'avais l'intention de le rendre définitif dans ce qui précède, mais quand j'ai fait ce que je voulais faire, je l'ai fait fonctionner et j'ai joué avec la partie de traitement de veille, donc je posterai cela aussi.

'''
Fonction de traduction à l'aide de DeepL
Saisissez l'anglais que vous souhaitez traduire
Sortie traduite en japonais
Exception lorsque l'entrée n'est pas une chaîne de caractères
'''
import time
from selenium import webdriver  
import chromedriver_binary

def TranslationByDeepL( mytext ):
    if mytext =="":
        return ""
    if type(mytext) is not str:
        raise   Exception("Pas une chaîne")

    #URL de la page DeeL et sélecteur CSS
    load_url = "https://www.deepl.com/ja/translator"
    input_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--source > div.lmt__textarea_container > div > textarea"
    Output_selector = "#dl_translator > div.lmt__sides_container > div.lmt__side_container.lmt__side_container--target > div.lmt__textarea_container > div.lmt__translations_as_text > p > button.lmt__translations_as_text__text_btn"

    '''
Si le processus WebDriver ne fonctionne pas, attendez 1 seconde et réessayez le processus WebDriver.
Cependant, si vous essayez 10 fois et que cela ne fonctionne pas, une erreur est renvoyée et le traitement de la fonction se termine.
Ci-dessous, le même traitement est effectué lorsque WebDriver est utilisé
    '''
    errCount=0
    f_succsess=False
    while not f_succsess:
        try: #Accéder à DeepL
            options = Options()
            options.add_argument('--headless')
            driver = webdriver.Chrome(options=options)  #  driver = webdriver.Chrome()
            driver.get(load_url)
            f_succsess = True
        except Exception  as identifier:
            errCount=errCount+1
            if errCount >=10:
                raise identifier
    
    #Envoyer l'anglais à DeepL
    errCount=0
    f_succsess=False
    while not f_succsess:
        try: #Envoyer l'anglais à DeepL
            driver.find_element_by_css_selector(input_selector).send_keys(mytext)
            f_succsess = True
        except Exception  as identifier:              
            errCount=errCount+1
            if errCount >=10:
                raise identifier
            time.sleep(1)

    #Pour les drapeaux
    Output_before = ""
    while 1:
        errCount=0
        f_succsess=False
        while not f_succsess:
            try:#Obtenez la sortie de DeepL
                Output = driver.find_element_by_css_selector(Output_selector).get_attribute("textContent")
                f_succsess = True
            except Exception  as identifier:               
                errCount=errCount+1
                if errCount >=10:
                    raise identifier
                time.sleep(1) 
        '''
Si la sortie acquise est un caractère vide, cela signifie que la traduction n'est pas encore terminée, alors vérifiez à nouveau après 1 seconde.
Si la sortie acquise n'est pas un caractère vide et que le contenu est différent de la sortie précédente,
Vérifiez à nouveau après 1 seconde car la traduction n'est pas encore terminée.
Si la sortie acquise n'est pas vide, et si elle a le même contenu que la sortie précédente, cela signifie que la traduction est terminée.
        '''        
        if Output != "" : #Si la sortie n'est pas vide, la sortie résultante a démarré
            if Output_before == Output:#Si la sortie est la même que la sortie précédente, cela signifie que la sortie est terminée.
                break
            Output_before = Output            
        time.sleep(1)

    #Fermer chrome
    driver.close()
 
    #Sortie de résultat
    return Output

Recommended Posts

Traduisez automatiquement DeepL en anglais avec Python et Selenium
Grattage avec Python, Selenium et Chromedriver
Exécuter la traduction Google et la traduction DeepL avec l'interface graphique
Pratiquer le web scraping avec Python et Selenium
Essayez d'exécuter Google Chrome avec Python et Selenium
Formater automatiquement le code Python en code compatible PEP8 avec Emacs
Faites glisser et déposez un fichier local avec Selenium (Python)
ScreenShot avec Selenium (édition Python)
Grattage avec du sélénium [Python]
Collez automatiquement des images dans des matériaux Powerpo avec python + α
Installez le sélénium sur votre Mac et essayez-le avec python
Suivi automatique sur Twitter avec python et sélénium! (RPA)
Automatisez Chrome avec Python et Selenium sur votre Chromebook
[Python] Traduisez automatiquement les PDF avec DeepL tout en conservant le format d'origine. [Windows / Word requis]
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Grattage au sélénium en Python
Python et matériel - Utilisation de RS232C avec Python -
Grattage avec Selenium + Python Partie 1
Python: travailler avec Firefox avec du sélénium
Grattage avec du sélénium en Python
python avec pyenv et venv
Défiez Python3 et Selenium Webdriver
Fonctionne avec Python et R
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Obtenez une traduction en anglais à l'aide de python google translation selenium (Remarque)
J'ai essayé de traduire de force des sous-titres anglais en japonais avec Udemy
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Scraping avec Selenium en Python (Basic)
Comment importer des fichiers CSV et TSV dans SQLite avec Python
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
Lire et écrire NetCDF avec Python
Créer automatiquement la documentation Python avec Sphinx
Comment installer automatiquement le pilote Chrome pour la version Chrome avec Python + Selenium + Chrome
Lire et écrire du CSV avec Python
Sélénium et python pour ouvrir Google
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Façonnez le texte d'une thèse en anglais avec une seule touche de raccourci et plongez dans la traduction DeepL
Communiquez entre Elixir et Python avec gRPC
Calculer et afficher le poids standard avec python
Obtenir le code HTML de l'élément avec du sélénium Python
Surveiller les pannes de Mojo avec Python et Skype
INSÉRER dans MySQL avec Python [Pour les débutants]
Reconnaissance vocale en anglais avec python [speech to text]
Créez automatiquement la documentation de l'API Python avec Sphinx
[Python] Combinez automatiquement et de manière transparente les images recadrées
Utiliser DeepL avec python (pour la traduction d'articles)