如何使用 Selenium 检索 WebElement 的文本 - Python

How to retrieve the text of a WebElement using Selenium - Python

我是 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()

我需要的值嵌入在 "R 4 516 469.32" 上方的 html 变量中。但是,此值每天都在变化。我曾尝试使用 xpath 和 css,但由于某些奇怪的原因,所讨论的值似乎被隐藏了。我怎样才能动态引用元素以便能够每天检索新值?

请注意:我已删除 url,因为这是一个用于公司目的的网站。

请帮忙!

非常感谢

所需的元素是动态元素,因此要在元素中提取文本,您必须为 visibility_of_element_located() 引入 WebDriverWait,您可以使用以下任一方法解决方案:

  • 使用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