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.
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.
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.
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.
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.
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.
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: "
Open Sans", 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? ??
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)
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