Selenium CSS Selector получает только первый элемент, в то время как инспектор показывает 4

Я пытаюсь автоматизировать словарь Linguee с помощью Selenium.

Selenium CSS Selector получает только первый элемент, в то время как инспектор показывает 4

Например, на изображении я хотел бы получить массив с [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 с похожими проблемами, такими как введите сюда описание ссылки, но проблема не устранена.

Извините, это многословно, но может ли кто-нибудь объяснить мне, почему это происходит и какие у меня есть варианты?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как работает метод 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.isMai‌​nTerm div.exact div.translation.sortablemg.featured a.dictLink") и работает правильно. Спасибо!

Antonio Manuel Mancera Hevilla 20.03.2022 17:54

Добро пожаловать :) Я рад, что смог вам помочь!

Prophet 20.03.2022 17:56

Другие вопросы по теме