Скрапинг этой страницы здесь. Я пытаюсь получить значок почты в именах. Я пробовал много вещей, но не могу щелкнуть/найти его. Некоторая помощь, пожалуйста?
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
Кажется, не у каждого автора есть такая иконка, но даже с учетом этого у вас есть пара ошибок в текущем подходе:
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}")
Примечания:
.
перед значением класса в селекторе CSS — это специальный синтаксис для сопоставления элемента с одним значением класса.@AbhishekRai хорошо, наверное, не все авторы указали там имя или фамилию, добавили туда попытку / кроме. Общие идеи в ответе остаются в силе. Кроме того, с каким URL вы его тестируете?
ой. Мне очень жаль, я добавил годы ..https://www.sciencedirect.com/search?qs = {search_term}&years=2021%2C2020%2C2019&lastSelectedFacet=years
выдает эту ошибку
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)