我是Python和Web爬虫的新手,所以请多多包涵。我一直在尝试构建一个Web抓取工具来打开网页,登录并检索某个值。到目前为止,我已经能够打开网页并登录。但是,我根本无法找到一种方法来检索(打印)所需的值。这是我当前的代码:
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,但是由于某些奇怪的原因,问题值似乎被隐藏了。我该如何动态引用该元素,以便每天都能检索到新值?
请注意:由于该网址是用于公司目的的网站,因此我已将该网址空白。
请帮助!
非常感谢
答案 0 :(得分:1)
所需元素是动态元素,因此要提取元素中的文本,必须为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