Python : 使用 Selenium 获取元素
Python : Get elements using Selenium
我正在使用带有 selenium 的网站:link
我在尝试时遇到了一些问题:select 输入和输出语言、输出文本和语言类型(formel 或 informel 或 automatique)
到目前为止我的代码:
# Make imports
# Define text to translate
text_to_translate = 'hello this is me not him'
chrome_options = Options()
chrome_options.add_argument("--headless")
TARGET_LANGUAGES = ({"french": 1,
"english": 2,
"german": 3,
"spanish": 4,
"portuguese": 5,
"italian": 6,
"dutch": 7,
"polish": 8,
"russian": 9})
#input is working good
input_text_xpath = """//*[@id="dl_translator"]/div[5]/div[2]/div[1]/div[2]/div[1]/textarea"""
output_text_xpath = """//*[@id="dl_translator"]/div[5]/div[2]/div[3]/div[3]/div[1]/textarea"""
language_select_xpath = """//*[@id="dl_translator"]/div[1]/div[3]/div[1]/div/button/div"""
target_language_xpath = f"""//*[@id="dl_translator"]/div[1]/div[3]/div[1]/div/div/button[{target_language=TARGET_LANGUAGES["english"]}]"""
# Start a Selenium driver
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_options)
# Reach the deepL website
deepl_url = 'https://www.deepl.com/fr/translator'
driver.get(deepl_url)
# Get thie inupt_area
input_area = driver.find_element_by_xpath(input_text_xpath)
# Send the text
input_area.clear()
input_area.send_keys(text_to_translate)
# Wait for translation to appear on the web page
time.sleep(2)
# Get copybutton and click on it
content= driver.find_element_by_xpath(output_text_xpath).text
# Display results
print('_'*50)
print('Original :', text_to_translate)
print('Translation :', content)
print('_'*50)
这是打开语言列表的 xpath:
//button[@dl-test='translator-source-lang-btn']
这是 select 语言的 xpath:
f"//div[@dl-test='translator-source-lang-list']/button[text()='{language}']"
这是打开转换成列表的xpath
//button[@dl-test='translator-target-lang-btn']
这是 select 翻译语言的 xpath
f"//button[contains(@dl-test,'translator-lang-option') and text() = '{translate}']"
这是打开 formal/informal 列表的 xpath
//button[@class = 'lmt__formalitySwitch__toggler']
这是 select formal/informal 选项的 xpath。将 'Automatic' 替换为您想要的选项。
(//div[@class='lmt__formalitySwitch__menu_items']//button[text()='Automatic'])[0]
所以先点击列表,然后传入你想要的列表项select
language = 'Danish'
driver.find_element_by_xpath("//button[@dl-test='translator-source-lang-btn']").click()
driver.find_element_by_xpath(f"//div[@dl-test='translator-source-lang-list']/button[text()='{language}']").click()
输出文本
driver.find_element_by_xpath("//div[@class='lmt__textarea_container lmt__textarea_container_no_shadow']).text
目标文本在 div
而不是 textarea
- 而且它还有 id
所以 xpath
是短的
'//div[@id="target-dummydiv"]'
但我无法使用
获取文本
content.text # empty list
但我可以用
得到它
content.get_attribute('innerHTML')
因为我使用的是波兰语页面,所以我的列表中有波兰语名称 - 即。 "Angielski"
而不是 "English"
所以我不能使用列表中的名字到 select 语言,我使用
源语言
@dl-test="translator-lang-option-en"
@dl-test="translator-lang-option-fr"
@dl-test="translator-lang-option-pl"
目标语言
@dl-test="translator-lang-option-en-EN"
@dl-test="translator-lang-option-fr-FR"
@dl-test="translator-lang-option-pl-PL"
有些语言显示了我可以得到的替代翻译
'//button[@class="lmt__translations_as_text__text_btn"]'
只需要跳过空字符串即可。
结果:
__________________________________________________
Original : hello this is me not him
Translation : Bonjour, c'est moi, pas lui.
Alternative : Bonjour, c'est moi et non lui.
Alternative : Allo, c'est moi, pas lui.
__________________________________________________
具有其他更改的完整工作代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time
# Define text to translate
source_text = 'hello this is me not him'
LANGUAGES = ({ # [source, target]
"french": ['fr', 'fr-FR'],
"english": ['en', 'en-GB'],
"german": ['de', 'de-DE'],
"spanish": ['es', 'es-ES'],
"portuguese": ['pt', 'pt-PT'],
"italian": ['it', 'it-IT'],
"dutch": ['da', 'da-DA'],
"polish": ['pl', 'pl-PL'],
"russian": ['ru', 'ru-RU']
})
#source_xpath = '//div[@dl-test="translator-source"]'
#target_xpath = '//div[@dl-test="translator-target"]'
source_input_text_xpath = '//textarea[@dl-test="translator-source-input"]'
#target_input_text_xpath = '//textarea[@dl-test="translator-target-input"]'
#target_output_text_xpath = '//div[@id="source-dummydiv"]
target_output_text_xpath = '//div[@id="target-dummydiv"]'
source_button_xpath = '//button[@dl-test="translator-source-lang-btn"]'
target_button_xpath = '//button[@dl-test="translator-target-lang-btn"]'
lang = LANGUAGES["english"][0] # 0 - source
source_language_xpath = f'//div[@dl-test="translator-source-lang-list"]//button[@dl-test="translator-lang-option-{lang}"]'
#lang = LANGUAGES["polish"][1] # 1 - target
lang = LANGUAGES["french"][1] # 1 - target
target_language_xpath = f'//div[@dl-test="translator-target-lang-list"]//button[@dl-test="translator-lang-option-{lang}"]'
# Start a Selenium driver
options = Options()
#options.add_argument("--headless")
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.set_window_size(1400, 1200)
# Reach the deepL website
url = 'https://www.deepl.com/en/translator'
#url = 'https://www.deepl.com/fr/translator'
#url = 'https://www.deepl.com/pl/translator'
driver.get(url)
# Select languages
driver.find_element_by_xpath(source_button_xpath).click() # open list
time.sleep(0.1) # wait for list
driver.find_element_by_xpath(source_language_xpath).click() # click option on list (maybe it will need to scroll)
driver.find_element_by_xpath(target_button_xpath).click() # open list
time.sleep(0.1) # wait for list
driver.find_element_by_xpath(target_language_xpath).click() # click option on list (maybe it will need to scroll)
# Select Automatic
driver.find_element_by_xpath('//button[@class="lmt__formalitySwitch__toggler"]').click()
time.sleep(0.1)
driver.find_element_by_xpath('//div[@class="lmt__formalitySwitch__menu_items"]//button[@_dl-connected="1"][3]').click()
# Get thie source inupt_area
input_area = driver.find_element_by_xpath(source_input_text_xpath)
# Send the text
input_area.clear()
input_area.send_keys(source_text)
# Wait for translation to appear on the web page
time.sleep(3)
# Get target text and alternatives
target_text = driver.find_element_by_xpath(target_output_text_xpath).get_attribute('innerHTML')
target_alternative_text = driver.find_elements_by_xpath('//button[@class="lmt__translations_as_text__text_btn"]')
# Display results
print('_'*50)
print('Original :', source_text)
print('Translation :', target_text.strip())
for item in target_alternative_text:
text = item.text.strip()
if text:
print('Alternative :', text)
print('_'*50)
结果:
我正在使用带有 selenium 的网站:link
我在尝试时遇到了一些问题:select 输入和输出语言、输出文本和语言类型(formel 或 informel 或 automatique)
到目前为止我的代码:
# Make imports
# Define text to translate
text_to_translate = 'hello this is me not him'
chrome_options = Options()
chrome_options.add_argument("--headless")
TARGET_LANGUAGES = ({"french": 1,
"english": 2,
"german": 3,
"spanish": 4,
"portuguese": 5,
"italian": 6,
"dutch": 7,
"polish": 8,
"russian": 9})
#input is working good
input_text_xpath = """//*[@id="dl_translator"]/div[5]/div[2]/div[1]/div[2]/div[1]/textarea"""
output_text_xpath = """//*[@id="dl_translator"]/div[5]/div[2]/div[3]/div[3]/div[1]/textarea"""
language_select_xpath = """//*[@id="dl_translator"]/div[1]/div[3]/div[1]/div/button/div"""
target_language_xpath = f"""//*[@id="dl_translator"]/div[1]/div[3]/div[1]/div/div/button[{target_language=TARGET_LANGUAGES["english"]}]"""
# Start a Selenium driver
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=chrome_options)
# Reach the deepL website
deepl_url = 'https://www.deepl.com/fr/translator'
driver.get(deepl_url)
# Get thie inupt_area
input_area = driver.find_element_by_xpath(input_text_xpath)
# Send the text
input_area.clear()
input_area.send_keys(text_to_translate)
# Wait for translation to appear on the web page
time.sleep(2)
# Get copybutton and click on it
content= driver.find_element_by_xpath(output_text_xpath).text
# Display results
print('_'*50)
print('Original :', text_to_translate)
print('Translation :', content)
print('_'*50)
这是打开语言列表的 xpath:
//button[@dl-test='translator-source-lang-btn']
这是 select 语言的 xpath:
f"//div[@dl-test='translator-source-lang-list']/button[text()='{language}']"
这是打开转换成列表的xpath
//button[@dl-test='translator-target-lang-btn']
这是 select 翻译语言的 xpath
f"//button[contains(@dl-test,'translator-lang-option') and text() = '{translate}']"
这是打开 formal/informal 列表的 xpath
//button[@class = 'lmt__formalitySwitch__toggler']
这是 select formal/informal 选项的 xpath。将 'Automatic' 替换为您想要的选项。
(//div[@class='lmt__formalitySwitch__menu_items']//button[text()='Automatic'])[0]
所以先点击列表,然后传入你想要的列表项select
language = 'Danish'
driver.find_element_by_xpath("//button[@dl-test='translator-source-lang-btn']").click()
driver.find_element_by_xpath(f"//div[@dl-test='translator-source-lang-list']/button[text()='{language}']").click()
输出文本
driver.find_element_by_xpath("//div[@class='lmt__textarea_container lmt__textarea_container_no_shadow']).text
目标文本在 div
而不是 textarea
- 而且它还有 id
所以 xpath
是短的
'//div[@id="target-dummydiv"]'
但我无法使用
获取文本content.text # empty list
但我可以用
得到它content.get_attribute('innerHTML')
因为我使用的是波兰语页面,所以我的列表中有波兰语名称 - 即。 "Angielski"
而不是 "English"
所以我不能使用列表中的名字到 select 语言,我使用
源语言
@dl-test="translator-lang-option-en"
@dl-test="translator-lang-option-fr"
@dl-test="translator-lang-option-pl"
目标语言
@dl-test="translator-lang-option-en-EN"
@dl-test="translator-lang-option-fr-FR"
@dl-test="translator-lang-option-pl-PL"
有些语言显示了我可以得到的替代翻译
'//button[@class="lmt__translations_as_text__text_btn"]'
只需要跳过空字符串即可。
结果:
__________________________________________________
Original : hello this is me not him
Translation : Bonjour, c'est moi, pas lui.
Alternative : Bonjour, c'est moi et non lui.
Alternative : Allo, c'est moi, pas lui.
__________________________________________________
具有其他更改的完整工作代码
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time
# Define text to translate
source_text = 'hello this is me not him'
LANGUAGES = ({ # [source, target]
"french": ['fr', 'fr-FR'],
"english": ['en', 'en-GB'],
"german": ['de', 'de-DE'],
"spanish": ['es', 'es-ES'],
"portuguese": ['pt', 'pt-PT'],
"italian": ['it', 'it-IT'],
"dutch": ['da', 'da-DA'],
"polish": ['pl', 'pl-PL'],
"russian": ['ru', 'ru-RU']
})
#source_xpath = '//div[@dl-test="translator-source"]'
#target_xpath = '//div[@dl-test="translator-target"]'
source_input_text_xpath = '//textarea[@dl-test="translator-source-input"]'
#target_input_text_xpath = '//textarea[@dl-test="translator-target-input"]'
#target_output_text_xpath = '//div[@id="source-dummydiv"]
target_output_text_xpath = '//div[@id="target-dummydiv"]'
source_button_xpath = '//button[@dl-test="translator-source-lang-btn"]'
target_button_xpath = '//button[@dl-test="translator-target-lang-btn"]'
lang = LANGUAGES["english"][0] # 0 - source
source_language_xpath = f'//div[@dl-test="translator-source-lang-list"]//button[@dl-test="translator-lang-option-{lang}"]'
#lang = LANGUAGES["polish"][1] # 1 - target
lang = LANGUAGES["french"][1] # 1 - target
target_language_xpath = f'//div[@dl-test="translator-target-lang-list"]//button[@dl-test="translator-lang-option-{lang}"]'
# Start a Selenium driver
options = Options()
#options.add_argument("--headless")
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.set_window_size(1400, 1200)
# Reach the deepL website
url = 'https://www.deepl.com/en/translator'
#url = 'https://www.deepl.com/fr/translator'
#url = 'https://www.deepl.com/pl/translator'
driver.get(url)
# Select languages
driver.find_element_by_xpath(source_button_xpath).click() # open list
time.sleep(0.1) # wait for list
driver.find_element_by_xpath(source_language_xpath).click() # click option on list (maybe it will need to scroll)
driver.find_element_by_xpath(target_button_xpath).click() # open list
time.sleep(0.1) # wait for list
driver.find_element_by_xpath(target_language_xpath).click() # click option on list (maybe it will need to scroll)
# Select Automatic
driver.find_element_by_xpath('//button[@class="lmt__formalitySwitch__toggler"]').click()
time.sleep(0.1)
driver.find_element_by_xpath('//div[@class="lmt__formalitySwitch__menu_items"]//button[@_dl-connected="1"][3]').click()
# Get thie source inupt_area
input_area = driver.find_element_by_xpath(source_input_text_xpath)
# Send the text
input_area.clear()
input_area.send_keys(source_text)
# Wait for translation to appear on the web page
time.sleep(3)
# Get target text and alternatives
target_text = driver.find_element_by_xpath(target_output_text_xpath).get_attribute('innerHTML')
target_alternative_text = driver.find_elements_by_xpath('//button[@class="lmt__translations_as_text__text_btn"]')
# Display results
print('_'*50)
print('Original :', source_text)
print('Translation :', target_text.strip())
for item in target_alternative_text:
text = item.text.strip()
if text:
print('Alternative :', text)
print('_'*50)
结果: