我创建了一个python脚本和selenium来解析网页中的特定内容。我可以AARONS INC
以许多不同的方式获得此结果,但我希望通过QUOTE
pseudo selector
来抓取它,不幸的是硒不支持。下面脚本中注释掉的行表示硒不支持pseudo selector
。
但是,当我在driver.execute_script()
中使用pseudo selector
时,我可以完美地解析它。为了完成这项工作,我必须使用硬编码延迟才能使元素可用。现在,我希望在Explicit Wait
条件下包装此driver.execute_script()
做同样的事情。
import time
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
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
driver.get("https://www.nyse.com/quote/XNYS:AAN")
time.sleep(15)
# item = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span:contains('AARONS')")))
item = driver.execute_script('''return $('span:contains("AARONS")')[0];''')
print(item.text)
如何在显式等待条件下包装driver.execute_script()
?
这是您可以实现这一目标的方法之一。试一试。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
with webdriver.Chrome() as driver:
wait = WebDriverWait(driver, 10)
driver.get('https://www.nyse.com/quote/XNYS:AAN')
item = wait.until(
lambda driver: driver.execute_script('''return $('span:contains("AARONS")')[0];''')
)
print(item.text)
您可以在浏览器脚本中执行 while 操作,这可能更安全:
item = driver.execute_async_script("""
var span, interval = setInterval(() => {
if(span = $('span:contains("AARONS")')[0]){
clearInterval(interval)
arguments[0](span)
}
}, 1000)
""")
这是简单的方法。
url = 'https://www.nyse.com/quote/XNYS:AAN'
driver.get(url)
# wait for the elment to be presented
ele = WebDriverWait(driver, 30).until(lambda driver: driver.execute_script('''return $('span:contains("AARONS")')[0];'''))
# print the text of the element
print (ele.text)