Проблемы с поиском элемента на странице. Селен, питон

Скрапинг этой страницы здесь. Я пытаюсь получить значок почты в именах. Я пробовал много вещей, но не могу щелкнуть/найти его. Некоторая помощь, пожалуйста?

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome(executable_path='C:/chromedriver.exe')
search_term = input("Enter your search term :")
url = f'https://www.sciencedirect.com/search?qs = {search_term}&show=100'
driver.get(url)
driver.maximize_window()

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div/div/div/button/span'))).click()
divs = driver.find_elements_by_class_name('result-item-content')
links = []
for div in divs:
    link = div.find_element_by_tag_name('a')
    links.append(link)
links[0].click()
div = driver.find_element_by_id('author-group')
print(div.text[0:])
name_links = div.find_elements_by_tag_name('a')
spans =[]
for name in name_links:
    span = name.find_element_by_tag_name('span')
    spans.append(span)

for span in spans:
    mail = span.find_element_by_class_name('icon icon-envelope')
    mail.click()
    break
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Кажется, не у каждого автора есть такая иконка, но даже с учетом этого у вас есть пара ошибок в текущем подходе:

  • вы смотрите внутрь каждого span элемента авторской группы - вам не нужно этого делать
  • find_element_by_class_name будет работать с одним значением класса, а не с несколькими (class — это многозначный атрибут, в котором пробел является разделителем между значениями)

Вот как бы я это сделал:

from selenium.common.exceptions import NoSuchElementException


author_group = driver.find_element_by_id('author-group')

for author in author_group.find_elements_by_css_selector("a.author"):
    try:
        given_name = author.find_element_by_css_selector(".given-name").text
        surname = author.find_element_by_css_selector(".surname").text
    except NoSuchElementException:
        print("Could not extract first or last name")
        continue

    try:
        mail_icon = author.find_element_by_css_selector(".icon-envelope")
        mail_icon_present = True
    except NoSuchElementException:
        mail_icon_present = False

    print(f"Author {given_name} {surname}. Mail icon present: {mail_icon_present}")

Примечания:

  • обратите внимание, как мы перебираем авторов, контейнер за контейнером, а затем ищем определенные свойства внутри каждого из них.
  • обратите внимание, как мы проверяем наличие значка почты в снисходительной манере EAFP
  • . перед значением класса в селекторе CSS — это специальный синтаксис для сопоставления элемента с одним значением класса.

выдает эту ошибку selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".given-name"} (Session info: chrome=87.0.4280.88)

Abhishek Rai 18.12.2020 18:20

@AbhishekRai хорошо, наверное, не все авторы указали там имя или фамилию, добавили туда попытку / кроме. Общие идеи в ответе остаются в силе. Кроме того, с каким URL вы его тестируете?

alecxe 18.12.2020 18:23

ой. Мне очень жаль, я добавил годы ..https://www.sciencedirect.com/search?qs = {search_term}&year‌​s=2021%2C2020%2C2019‌​&lastSelectedFacet=y‌​ears

Abhishek Rai 18.12.2020 18:24

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