Как очистить веб-сайт с раскрывающимся списком ul-li в Python? - PullRequest
0 голосов
/ 14 июля 2020

На основании вопроса Очистка определенного c веб-сайта с окном поиска и javascripts в Python, я пытаюсь очистить рейтинги компаний с веб-сайта https://www.msci.com/esg-ratings/ В основном, ввод названия компании в поле поиска, выбор всех опций для этого имени в выпадающем меню («RIO TINTO LIMITED» и «RIO TINTO PL C» здесь для «rio tinto») и получение изображения с рейтинг расположен в правом верхнем углу для обоих.

Однако у меня проблемы с обработкой выпадающего меню ul-li с предложенными компаниями:

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

options = webdriver.ChromeOptions()
options.add_argument('-headless')
options.add_argument('-no-sandbox')
options.add_argument('-disable-dev-shm-usage')
options.add_argument('window-size=1920,1080')

wd = webdriver.Chrome(options=options)
wd.get('https://www.msci.com/esg-ratings')

WebDriverWait(wd, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="_esgratingsprofile_keywords"]'))).send_keys("RIO TINTO")
WebDriverWait(wd, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="ui-id-1"]/li[1]'))).click()
#WebDriverWait(wd,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#_esgratingsprofile_esg-ratings-profile-header > div.esg-ratings-profile-header-ratingdata > div.ratingdata-container > div.ratingdata-outercircle.esgratings-profile-header-yellow > div")))
print(wd.find_element_by_xpath('//*[@id="_esgratingsprofile_esg-ratings-profile-header"]/div[2]/div[1]/div[2]/div'))

(код дает исключение ElementClickInterceptedException.)

Как получить доступ к необходимым данным для "RIO TINTO LIMITED" и "RIO TINTO PL C"?

1 Ответ

0 голосов
/ 15 июля 2020

У меня проблемы с обработкой выпадающего меню ul-li с предложенными компаниями

Это ожидается, поскольку element, на который вы нацеливаетесь, отображается с помощью сценария dynamic. Вам придется избегать options.add_argument('-headless'), чтобы преодолеть это.

У вас также есть проблема

print(wd.find_element_by_xpath('//*[@id="_esgratingsprofile_esg-ratings-profile-header"]/div[2]/div[1]/div[2]/div'))

, когда вы пытаетесь распечатать элемент. Поскольку целевой элемент визуализируется icon на CSS, вы не можете использовать print() для вывода этого. Вместо этого вам нужно сохранить его как, например, .png файл

with open('filename.png', 'wb') as file:
    file.write(driver.find_element_by_xpath('//*[@id="_esgratingsprofile_esg-ratings-profile-header"]/div[2]/div[1]/div[2]/div').screenshot_as_png)

И затем использовать его для своих нужд.

...