Как получить текст WebElement с помощью Selenium - Python - PullRequest
2 голосов
/ 19 марта 2019

Я новичок в Python и Web Scraping, поэтому, пожалуйста, потерпите меня. Я пытался создать инструмент для просмотра веб-страниц, чтобы открыть веб-страницу, войти в систему и получить определенное значение. До сих пор я был в состоянии открыть веб-страницу и войти в систему. Однако я просто не могу найти способ получить (распечатать) нужное мне значение. Вот как выглядит мой текущий код:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome(executable_path=r'C:/Users/User/Downloads/chromedriver.exe')

url = "xxxxxxxx"
driver.get(url)
driver.find_element_by_name("username").send_keys("xxxxx")
driver.find_element_by_name("password").send_keys("xxxxx")
elem = driver.find_element_by_css_selector("form#frmMain > a:nth-child(4)")
elem.click()

html = '''<p class="value noWrap" data-bind="text: MarketValue">R 4 516 469.32</p>'''
soup = BeautifulSoup(html, 'lxml')

for p in soup.find_all('p'):
    print(p.string)

driver.quit()

Требуемое мной значение встроено в html-переменную выше «R 4 516 469,32». Однако это значение меняется ежедневно. Я пытался использовать xpath и css, но рассматриваемое значение кажется скрытым по какой-то странной причине. Как я могу ссылаться на элемент динамически, чтобы иметь возможность получать новое значение каждый день?

Обратите внимание: я исключил URL-адрес, поскольку этот веб-сайт используется для корпоративных целей.

Пожалуйста, помогите!

Большое спасибо

1 Ответ

1 голос
/ 19 марта 2019

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

  • Использование CSS_SELECTOR:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "p.value.noWrap[data-bind$='MarketValue']"))).get_attribute("innerHTML"))
    
  • Использование XPATH:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//p[@class='value noWrap' and contains(@data-bind,'MarketValue')]"))).get_attribute("innerHTML"))
    
  • Примечание: Вы должны добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...