Как найти элементы через Selenium и Xpath

Итак, я пытаюсь удалить некоторую информацию с веб-сайта, и когда я пытаюсь получить элемент по xpath, я получаю сообщение об ошибке «Невозможно найти элемент», когда путь, который я предоставляю, копируется непосредственно из инструмента проверки. Я попробовал пару вещей, но это не сработало, поэтому я сказал себе, что собираюсь попробовать более простой путь (ТЕСТ), но все еще не работает. Возможно ли, что сайт не показывает весь html-код при проверке?

Вот код с веб-сайтом и xpath, который я пробовал.

URL_TRADER = 'https://www.tipranks.com/analysts/joseph-foresi?benchmark=none&period=yearly'

TEST = 'html/body/div[@id="app"]/div[@class="logged-out free"]/div[@class="client-components-app-app__wrapper undefined undefined"]'#/div/div[1]/div/div[2]/div/section/main/table/tbody/tr[3]/td[3]/div/div/div/div[1]/span'

X_PATH = '//*[@id="app"]/div/div/div[2]/div/div[1]/div/div[2]/div/section/main/table/tbody/tr[1]/td[3]/div/div/div/div[1]/span'

Основная функция:

def trader_table():

  # Loading Chrome and getting to the website
  driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
  driver.get(URL_TRADER)
  driver.implicitly_wait(10)
  text = driver.find_element_by_xpath(X_PATH).get_attribute('innerHTML')

  return text

person Babas    schedule 17.03.2019    source источник
comment
вы можете указать элемент, который вы хотите xpath   -  person bhupathi turaga    schedule 17.03.2019
comment
Можете ли вы предоставить html-код того элемента, который вы пытаетесь достичь?   -  person Nic Laforge    schedule 17.03.2019


Ответы (4)


Я добавил условие ожидания и вместо этого использовал комбинацию селектора css, но это то же самое, что и ваш xpath, я думаю

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

url = 'https://www.tipranks.com/analysts/joseph-foresi?benchmark=none&period=yearly'
driver = webdriver.Chrome()
driver.get(url)
data =  WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".client-components-experts-infoTable-expertTable__table .client-components-experts-infoTable-expertTable__dataRow td:nth-child(3)"))).get_attribute('innerHTML')
print(data)
person QHarr    schedule 17.03.2019

Вы предоставили все необходимые сведения, необходимые для построения ответа, но не указали явно, какой элемент вы пытаетесь получить.

Однако закомментированный xpath в TEST дает нам подсказку, что вы следовали за целевой ценой, и чтобы извлечь текст из этих элементов в качестве элементов являются элементами с поддержкой JavaScript, вам нужно вызвать WebDriverWait для visibility_of_all_elements_located(), и вы можете используйте следующее решение:

  • Блок кода:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions()
    options.add_argument('start-maximized')
    options.add_argument('disable-infobars')
    options.add_argument('--disable-extensions')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://www.tipranks.com/analysts/joseph-foresi?benchmark=none&period=yearly")
    print([element.get_attribute('innerHTML') for element in WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='client-components-experts-infoTable-expertTable__isBuy']//span")))])
    
  • Консольный вывод:

    ['$14.00', '$110.00', '$237.00', '$36.00', '$150.00', '$71.00', '$188.00', '$91.00', '$101.00', '$110.00']
    
person DebanjanB    schedule 17.03.2019
comment
Отличный ответ, и извините, если я не совсем понял, в чем была моя цель. - person Babas; 18.03.2019
comment
@Babas Рад, что смог вам помочь. Пожалуйста, примите ответ , щелкнув пустую галочку рядом с моим ответом, которая находится чуть ниже стрелки votedown, чтобы галочка стала зеленой. - person DebanjanB; 18.03.2019

Думаю, вы присматриваете за price Вот и все.

from selenium import webdriver
URL_TRADER = 'https://www.tipranks.com/analysts/joseph-foresi?benchmark=none&period=yearly'

TEST = 'html/body/div[@id="app"]/div[@class="logged-out free"]/div[@class="client-components-app-app__wrapper undefined undefined"]'#/div/div[1]/div/div[2]/div/section/main/table/tbody/tr[3]/td[3]/div/div/div/div[1]/span'

X_PATH = "//div[@class='client-components-experts-infoTable-expertTable__isBuy']/div/span"

def trader_table():
 driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
 driver.get(URL_TRADER)
 driver.implicitly_wait(10)
 text = driver.find_element_by_xpath(X_PATH).get_attribute('innerHTML')
 print(text)
 return text

Изменено для всех строк

    from selenium import webdriver
    URL_TRADER = 'https://www.tipranks.com/analysts/joseph-foresi?benchmark=none&period=yearly'

    X_PATH = "//div[@class='client-components-experts-infoTable-expertTable__isBuy']/div/span"


    def trader_table():
     driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver')
     driver.get(URL_TRADER)
     driver.implicitly_wait(10)
     list_ele= driver.find_elements_by_xpath(X_PATH)
     price_list = []
     for ele in list_ele:
         print(ele.text)
         price_list.append(ele.text)

     return price_list

list=trader_table()
print(list)
person KunduK    schedule 17.03.2019
comment
Привет, большое спасибо! у вас есть идея, почему xpath из инструмента проверки дает неправильный путь? - person Babas; 18.03.2019
comment
и как мне изменить X_PATH, который вы мне предоставили, чтобы получить другие значения. Я пытался использовать text () вместо get_attribute ('innerHTML'), но это не работает - person Babas; 18.03.2019
comment
@babas: вы следите за ценами всех строк? - person KunduK; 18.03.2019
comment
use driver.find_element_by_xpath(X_PATH).text мне напечатана цена. - person KunduK; 18.03.2019
comment
@Babas: Проверьте мой обновленный код для всех строк. Я взял список для хранения всех значений. - person KunduK; 18.03.2019

from selenium import webdriver
import time

driver = webdriver.Chrome("your webdriver location")
driver.get("https://www.tipranks.com/analysts/joseph-foresi?benchmark=none&period=yearly")
time.sleep(10)
y = driver.find_element_by_id('app').get_attribute('innerHTML')
print(y)

печатает полный внутренний HTML

person bhupathi turaga    schedule 17.03.2019