如何使用 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
我是 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