Übersetzen Sie DeepL automatisch mit Python und Selen ins Englische

Was du machen willst

Vorerst erhielt ich bibliografische Informationen + Abst von Science Direct. Als nächstes möchte ich dies verarbeiten, indem ich es in DeepL gieße und übersetze. Wenn Sie sich für einen kostenpflichtigen Tarif anmelden, können Sie die Dateien sofort übersetzen. Es ist jedoch eine Herausforderung, ihn mit Selenimu und Chromedriver zu testen.

Vorbereitung

Laden Sie vorerst die CSV-Datei in Python.

import pandas as pd

df = pd.read_csv("DB.csv",header=None, delimiter=",", quoting=1)
print(df.at[0,1])  #Titel
print(df.at[0,9])  #Abst
print(df.at[0,10]) #Stichwort

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

Nun, das ist glatt.

Greifen Sie mit Selenium und Chrom Driver auf DeepL zu

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)

Auch hier läuft es reibungslos.

Senden Sie Englisch an DeepL

Suchen Sie beim Senden von Text und Abrufen einer Übersetzung den CSS-Selektor des Textbereichs für die Eingabe englischer Sätze und den Textbereich für die Ausgabe der Übersetzung vom Entwicklerbildschirm von Chrome. Die Eingabe ist also reibungslos.

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

Es stellte sich heraus, dass. Damit

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)

Ehrlich gesagt habe ich Englisch an DeepL geschickt.

Erwerb der japanischen Übersetzung Teil 1

Andererseits passt der Ausgang besser. Nachdem ich eine Übersetzung in einen geeigneten englischen Satz erstellt und ausgegeben hatte, suchte und suchte ich vorerst auf dem Developper-Bildschirm unter Verwendung des Ausgabetextes, aber es wurde nicht wie im Textbereich eingegeben, sondern ein Schaltflächen-Tag wurde angehängt Wird angezeigt. Ich habe versucht, das Schaltflächenelement abzurufen und den Text zu übernehmen, konnte ihn jedoch aus irgendeinem Grund nicht abrufen. Selbst wenn Sie den Status der Variablen mit dem VSCode-Debugger betrachten, ist der Text des Elements leer. e? Warum? ?? Ich kann es in Chrome sehen und auf dem Developper-Bildschirm wird die Übersetzung zwischen den Schaltflächen-Tags korrekt angezeigt. Aber warum ist es ein leeres Zeichen? ??

Zur Umgehung dieses Problems verfügt DeepL vorerst über eine praktische Schaltfläche, mit der die Übersetzung in die Zwischenablage kopiert wird. Daher werde ich mit Selenium darauf klicken, um sie in die Zwischenablage zu kopieren und die Übersetzung aus der Zwischenablage abzurufen. Installieren Sie also das Paket "pyperclip" für die Handhabung der Zwischenablage, suchen Sie den CSS-Selektor der Schaltfläche, die in die Zwischenablage kopiert werden soll, schreiben Sie das folgende Skript und führen Sie es aus.

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, ich habe es verstanden.

Erwerb der japanischen Übersetzung Teil 2

Ich habe das Gefühl, verloren zu haben, also werde ich es erneut versuchen, wenn ich den Text direkt vom Schaltflächenelement erhalten kann. Als ich googelte, stieß ich auf @ riikunn1004s Artikel. Das war's. Kann es genommen werden, weil es ".getAttribute (" textContent ")" heißt? Ich kann es auf dem Bildschirm sehen und bin mir nicht sicher, warum ich es nicht bekommen kann, obwohl ich es auf dem Developper-Bildschirm sehen kann, aber ich habe versucht, das folgende Skript in Bezug darauf zu erstellen.

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)

Bestätigen Sie, dass dies möglich ist. Huh.

Bonus

Ich habe die Struktur der Deep L-Seite etwas genauer überprüft. Ausgabetextbereich sowie Eingabetextbereich

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

Es wird angegeben durch. Wenn ich mir jedoch CSS anschaue, ist : disabled angehängt und der Vorgang ist deaktiviert. Tatsächlich können Sie den Ausgabebereich nicht auswählen, bevor Sie den englischen Text eingeben. Wenn Sie also Englisch eingeben, ändert sich der Klassenname in diesem Bereich und die Deaktivierung verschwindet. (Der CSS-Selektor ändert sich nicht.)

Aber gibt es in diesem Bereich eine Übersetzung? Das ist nicht enthalten. Es sieht so aus, als ob eine Übersetzung auf dem Bildschirm angezeigt wird, die jedoch zu diesem Zeitpunkt leer bleibt.

Wenn Sie mit der Maus auf diesen Bereich klicken und sich auf den Textbereich konzentrieren, werden die folgenden Elemente angezeigt und die Übersetzung angezeigt. (Übrigens habe ich den Test als Englisch eingegeben, daher übersetze ich ihn nicht.)

<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>

Der CSS-Selektor dieses Typen

#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, ich habe es irgendwie verstanden. Mit anderen Worten, die Seite von DeepL wird bei der Eingabe von englischem Text auf dem Bildschirm angezeigt, jedoch nicht im Textbereich.

Eigentlich im unteren Teil so

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

Ich habe es versteckt. Wenn Sie also den Cursor an die Stelle bringen, die wie der "Textbereich" der Ausgabe auf dem Bildschirm aussieht, und den Klick drücken, wird das div-Element wie das oben gezeigte erweitert und die Übersetzung angezeigt. Bedeutet das, dass es sich um ein Schaltflächenelement handelt, um diesen Wechsel vorzunehmen?

Es ist ziemlich kompliziert. Warum machst du es so? ?? Ich verstehe jedoch. Bei dieser Art von Struktur können Sie keine Übersetzung finden, indem Sie sich im Textbereich umsehen, es sei denn, Sie klicken einmal auf den Teil, der wie ein "Textbereich" aussieht. Außerdem ist die Schaltfläche grundsätzlich deaktiviert oder unsichtbar, sodass sie nicht mit ".text" verwendet werden kann. Selbst wenn Sie den CSS-Selektor des Elements erhalten, das angezeigt wird, wenn Sie sich im Voraus darauf konzentrieren, und versuchen, nach einer Übersetzung darauf zuzugreifen, wird es als "Es gibt kein solches Element" abgespielt, es sei denn, Sie konzentrieren sich einmal auf den Textbereich. .. Konzentriere dich nur einmal und du wirst das Element finden, also denke ich, dass du es bekommen kannst.

Wirklich, warum machst du so eine komplizierte Sache? ??

~~ Final ~~ Quellcode

Derzeit wird der folgende Teil an DeepL gesendet, um englische Sätze automatisch zu übersetzen. Die while-Anweisung in der Mitte benötigt Zeit, um den englischen Satz zu übersetzen. Dies liegt an der Wartezeit. Überprüfen Sie jede Sekunde, ob die Übersetzung erfolgreich war, und brechen Sie ab, ob die Übersetzung abgeschlossen ist.

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)

Funktionalisierung

Ich wollte es oben endgültig machen, aber als ich tatsächlich tat, was ich tun wollte, machte ich es zu einer Funktion und spielte mit dem Standby-Verarbeitungsteil, also werde ich das auch posten.

'''
Funktion zum Übersetzen mit DeepL
Geben Sie Englisch ein, das Sie übersetzen möchten
Ausgabe übersetzt Japanisch
Ausnahme, wenn die Eingabe keine Zeichenfolge ist
'''
import time
from selenium import webdriver  
import chromedriver_binary

def TranslationByDeepL( mytext ):
    if mytext =="":
        return ""
    if type(mytext) is not str:
        raise   Exception("Keine Schnur")

    #DeeL-Seiten-URL und CSS-Auswahl
    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"

    '''
Wenn der WebDriver-Prozess nicht funktioniert, warten Sie 1 Sekunde und wiederholen Sie den WebDriver-Prozess.
Wenn Sie es jedoch 10 Mal versuchen und es nicht funktioniert, wird ein Fehler zurückgegeben und die Funktionsverarbeitung beendet.
Im Folgenden wird dieselbe Verarbeitung ausgeführt, wenn WebDriver verwendet wird
    '''
    errCount=0
    f_succsess=False
    while not f_succsess:
        try: #Greifen Sie auf DeepL zu
            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
    
    #Senden Sie Englisch an DeepL
    errCount=0
    f_succsess=False
    while not f_succsess:
        try: #Senden Sie Englisch an 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)

    #Für Flaggen
    Output_before = ""
    while 1:
        errCount=0
        f_succsess=False
        while not f_succsess:
            try:#Holen Sie sich die Ausgabe von 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) 
        '''
Wenn die erfasste Ausgabe ein leeres Zeichen ist, bedeutet dies, dass die Übersetzung noch nicht abgeschlossen ist. Überprüfen Sie sie daher nach 1 Sekunde erneut.
Wenn die erfasste Ausgabe kein Leerzeichen ist und sich der Inhalt von der vorherigen Ausgabe unterscheidet,
Nach 1 Sekunde erneut prüfen, da die Übersetzung noch nicht abgeschlossen ist.
Wenn die erfasste Ausgabe nicht leer ist und denselben Inhalt wie die vorherige Ausgabe hat, bedeutet dies, dass die Übersetzung abgeschlossen ist.
        '''        
        if Output != "" : #Wenn die Ausgabe nicht leer ist, wurde die resultierende Ausgabe gestartet
            if Output_before == Output:#Wenn die Ausgabe mit der vorherigen Ausgabe identisch ist, bedeutet dies, dass die Ausgabe abgeschlossen ist.
                break
            Output_before = Output            
        time.sleep(1)

    #Chrom schließen
    driver.close()
 
    #Ergebnisausgabe
    return Output

Recommended Posts

Übersetzen Sie DeepL automatisch mit Python und Selen ins Englische
Scraping mit Python, Selen und Chromedriver
Führen Sie die Google-Übersetzung und die DeepL-Übersetzung mit der GUI aus
Üben des Web-Scrapings mit Python und Selen
Versuchen Sie, Google Chrome mit Python und Selenium auszuführen
Formatieren Sie Python-Code mit Emacs automatisch in PEP8-kompatiblen Code
Ziehen Sie eine lokale Datei mit Selenium (Python) per Drag & Drop.
Screenshot mit Selen (Python Edition)
Schaben mit Selen [Python]
Fügen Sie Bilder mit Python + α automatisch in Powerpo-Materialien ein
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Automatisches Folgen auf Twitter mit Python und Selen! (RPA)
Automatisieren Sie Chrome mit Python und Selen auf Ihrem Chromebook
[Python] PDF automatisch mit DeepL übersetzen, dabei das Originalformat beibehalten. [Windows / Word erforderlich]
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Schaben mit Selen in Python
Python und Hardware-Verwenden von RS232C mit Python-
Schaben mit Selen + Python Teil 1
Python: Arbeiten mit Firefox mit Selen
Scraping mit Selen in Python
Python mit Pyenv und Venv
Fordern Sie Python3 und Selenium Webdriver heraus
Funktioniert mit Python und R.
Ich möchte automatisch an Online-Kursen mit Python + Selen teilnehmen!
Holen Sie sich eine englische Übersetzung mit Python Google Translation Selen (Hinweis)
Ich habe versucht, englische Untertitel mit Udemy gewaltsam ins Japanische zu übersetzen
So melden Sie sich mit Python bei AtCoder an und senden automatisch
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
Scraping mit Selen in Python (Basic)
So importieren Sie CSV- und TSV-Dateien mit Python in SQLite
Kratzen mit Python und schöner Suppe
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
Lesen und Schreiben von NetCDF mit Python
Erstellen Sie automatisch eine Python-Dokumentation mit Sphinx
So installieren Sie Chrome Driver für Chrome automatisch mit Python + Selenium + Chrome
Lesen und Schreiben von CSV mit Python
Selen und Python zum Öffnen von Google
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Formatieren Sie den Text eines englischen Papiers mit einer einzigen Tastenkombination und tauchen Sie in die DeepL-Übersetzung ein
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Holen Sie sich HTML von Element mit Python-Selen
Überwachen Sie Mojo-Ausfälle mit Python und Skype
INSERT in MySQL mit Python [Für Anfänger]
Englische Spracherkennung mit Python [Rede zu Text]
Erstellen Sie automatisch eine Python-API-Dokumentation mit Sphinx
[Python] Kombiniert zugeschnittene Bilder automatisch und nahtlos
Verwenden Sie DeepL mit Python (für die Artikelübersetzung)