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