Как найти элементы через Selenium и Xpath - PullRequest
0 голосов
/ 17 марта 2019

Поэтому я пытаюсь удалить некоторую информацию с веб-сайта, и когда я пытаюсь получить элемент по 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

Ответы [ 4 ]

1 голос
/ 17 марта 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']
    
1 голос
/ 17 марта 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)
1 голос
/ 17 марта 2019

Я добавил условие ожидания и использовал вместо этого комбинацию селекторов 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)
0 голосов
/ 17 марта 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...