使用 python 在 selenium 和 phantomjs 中显式等待
explicit waits in selenium and phantomjs with python
我正试图从这个 site 和这个站点上的许多其他 "wines" 中抓取一些数据,并且我正在使用 selenium 作为它的一个 JS
站点来这样做.但是,我发现我的代码有时只能工作,有时它不会 return 任何值,即使没有任何变化。
我想我应该使用 selenium
的显式等待来克服这个挑战,但是我不确定如何集成它们,所以任何关于这样做的指导都会有所帮助!
我的密码是
def ct_content(url):
browser = webdriver.PhantomJS()
browser.get(url)
wait = WebDriverWait(driver, 10)
html = browser.page_source
html = lxml.html.fromstring(html)
try:
content = html.xpath('//a[starts-with(@href, "list.asp?Table=List")]/text()')
browser.quit()
return content
except:
browser.quit()
return False
谢谢!
看来您从未真正使用过隐式等待。这就是我编写带有显式等待的脚本的方式。
def ct_content(url):
browser = webdriver.PhantomJS()
browser.get(url)
wait = WebDriverWait(browser, 10)
try:
content = wait.until(EC.element_to_be_clicable((By.XPATH, '//a[starts-with(@href, "list.asp?Table=List")]')))
browser.quit()
return content.text
except:
browser.quit()
return False
另外,设置隐式等待的方法是:
browser.implicitly_wait(10) # seconds
尝试使用更具体的 XPath
:
//ul[@class="twin_set_list"]//a/text()
也没有必要使用lxml
。只需尝试:
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
data = [link.get_attribute('textContent') for link in wait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//ul[@class="twin_set_list"]//a')))]
我正试图从这个 site 和这个站点上的许多其他 "wines" 中抓取一些数据,并且我正在使用 selenium 作为它的一个 JS
站点来这样做.但是,我发现我的代码有时只能工作,有时它不会 return 任何值,即使没有任何变化。
我想我应该使用 selenium
的显式等待来克服这个挑战,但是我不确定如何集成它们,所以任何关于这样做的指导都会有所帮助!
我的密码是
def ct_content(url):
browser = webdriver.PhantomJS()
browser.get(url)
wait = WebDriverWait(driver, 10)
html = browser.page_source
html = lxml.html.fromstring(html)
try:
content = html.xpath('//a[starts-with(@href, "list.asp?Table=List")]/text()')
browser.quit()
return content
except:
browser.quit()
return False
谢谢!
看来您从未真正使用过隐式等待。这就是我编写带有显式等待的脚本的方式。
def ct_content(url):
browser = webdriver.PhantomJS()
browser.get(url)
wait = WebDriverWait(browser, 10)
try:
content = wait.until(EC.element_to_be_clicable((By.XPATH, '//a[starts-with(@href, "list.asp?Table=List")]')))
browser.quit()
return content.text
except:
browser.quit()
return False
另外,设置隐式等待的方法是:
browser.implicitly_wait(10) # seconds
尝试使用更具体的 XPath
:
//ul[@class="twin_set_list"]//a/text()
也没有必要使用lxml
。只需尝试:
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
data = [link.get_attribute('textContent') for link in wait(browser, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//ul[@class="twin_set_list"]//a')))]