Я пытаюсь автоматизировать словарь Linguee с помощью Selenium.
Например, на изображении я хотел бы получить массив с [de, para, por, con]. Чтобы получить это, я написал следующий код
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.by import By
s=Service(r"C:\Users\Usuario\python\geckodriver.exe")
driver = webdriver.Firefox(service=s)
driver.get('https://www.linguee.fr/frances-espanol/')
consent_button=driver.find_element(By.CSS_SELECTOR, "div[class='sn-b-def sn-blue']")
consent_button.click()
search_input=driver.find_element(By.CSS_SELECTOR, "input[id='queryinput']")
search_input.send_keys("de")
buttonSearch=driver.find_element(By.CSS_SELECTOR, "button[alt='Rechercher dans le dictionnaire français-espagnol']")
buttonSearch.click()
wortType=driver.find_element(By.CSS_SELECTOR, "span[class='tag_wordtype']").text
print( wortType)
translations=driver.find_element(By.CSS_SELECTOR, "div[class='isMainTerm'] a[class='dictLink']").text
print(translations)
Код работает правильно, но возвращает только первые переводы ("en" на изображении), а в консоли браузера я получаю 4. Итак, я читал и пробовал разные способы решения проблемы, например, изменить CSS_SELECTOR
translations=driver.find_element(By.CSS_SELECTOR,"div[class='isMainTerm'] div[class='exact'] div[class='lemma featured'] div[class='lemma_content'] div[gid=0] div[class='translation_lines'] div[class='translation sortablemg featured'] a")
translations=driver.find_element(By.CSS_SELECTOR, "div[class='isMainTerm'] a[class='dictLink']").text
translations=driver.find_element(By.CSS_SELECTOR, "div[class='isMainTerm'] a[class='dictLink']")
translations=driver.find_element(By.CSS_SELECTOR,"div.isMainTerm div.lemma_content a.dictLink").text
translations=driver.find_element(By.CSS_SELECTOR, "div[class='isMainTerm']> a[class='dictLink featured']").text
Я также использовал XPath, но также возвращает только один. Я читал разные сообщения в stackoverflow с похожими проблемами, такими как введите сюда описание ссылки, но проблема не устранена.
Извините, это многословно, но может ли кто-нибудь объяснить мне, почему это происходит и какие у меня есть варианты?
Вот как работает метод find_element
.
Он возвращает соответствующий элемент первый в найденной модели DOM.
Поэтому, если вы передаете ему локатор, соответствующий нескольким элементам на странице, будет возвращен первый соответствующий элемент в DOM.
Если вы хотите получить все, вместо этого следует использовать элементы, соответствующие этому методу локатора find_elements
.
Итак, если вы хотите получить все тексты в элементах, соответствующих div[class='isMainTerm'] a[class='dictLink']
CSS Selector вместо
translations=driver.find_element(By.CSS_SELECTOR, "div[class='isMainTerm'] a[class='dictLink']").text
print(translations)
Ты можешь использовать
translations = driver.find_elements(By.CSS_SELECTOR, "div[class='isMainTerm'] a[class='dictLink']")
for translation in translations:
print(translation.text)
Кстати, только этот локатор селектора CSS div[class='isMainTerm'] a[class='dictLink featured']
соответствует 4 элементам, как вы упомянули, и похоже, что этот локатор вы должны использовать здесь, в то время как локатор div[class='isMainTerm'] a[class='dictLink']
соответствует 81 элементу! на этой странице.
Добро пожаловать :) Я рад, что смог вам помочь!
Вы правы во всем. Кроме того, я меняю CSS_Selector для translations=driver.find_elements(By.CSS_SELECTOR,"div.isMainTerm div.exact div.translation.sortablemg.featured a.dictLink") и работает правильно. Спасибо!