使用Python和Selenium等待表格完全加载

4
我想从一个表格页面中爬取一些数据,所以我只关心表格中的数据。以前我使用Mechanize,但我发现有时候表格底部的一些数据会丢失。通过搜索,我发现这可能是由于Mechanize没有处理Jquery/Ajax所导致的。
所以今天我切换到了Selenium。如何等待一个并且仅一个表格完全加载后,并使用Selenium和Python提取该表格中的所有链接?如果等待整个页面加载,它需要一些时间。我想确保仅加载表格中的数据。我的当前代码:
driver = webdriver.Firefox()
for page in range(1, 2):
    driver.get("http://somesite.com/page/"+str(page))
    table = driver.find_element_by_css_selector('div.datatable')
    links = table.find_elements_by_tag_name('a')
    for link in links:
        print link.text
2个回答

7
使用WebDriverWait来等待直到表格被定位:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

...
wait = WebDriverWait(driver, 10)
table = wait.until(EC.presence_of_element_located(By.CSS_SELECTOR, 'div.datatable'))

这将是一个显式等待

另外,您可以使驱动程序 隐式等待

隐式等待是告诉WebDriver,在尝试查找元素或元素时,如果它们不立即可用,则轮询DOM一定时间。默认设置为0。设置后,隐式等待将设置为WebDriver对象实例的生命周期。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # wait up to 10 seconds while trying to locate elements
for page in range(1, 2):
    driver.get("http://somesite.com/page/"+str(page))
    table = driver.find_element_by_css_selector('div.datatable')
    links = table.find_elements_by_tag_name('a')
    for link in links:
        print link.text

感谢您的提问 :) presence_of_element_located 的显式等待是否确保表格完全加载而不仅仅是部分加载?如果这个问题太傻了,对不起,我不知道。另外,我想要一个东西,这样我就不必等待页面中的其他元素,只需等待表格。一旦表格加载完成,我就可以继续前进,而不必等待其他元素。 - user3215014
如果precense_of_element_located在这里没有影响,那么设置一个隐式等待 - 应该会有所帮助。 - alecxe
“datatable” 是 div 的类型还是类名? - alper

0

也许你可以使用Selenium的预期条件(http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp),例如:

>>> 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 
>>> 
>>> ff = webdriver.Firefox()
>>> ff.get("http://www.datatables.net/examples/data_sources/js_array.html")
>>> try:
...     element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "example")))
...     print element.text
... finally:
...     ff.quit()
... 

Engine Browser Platform Version Grade
Gecko Firefox 1.0 Win 98+ / OSX.2+ 1.7 A
Gecko Firefox 1.5 Win 98+ / OSX.2+ 1.8 A
Gecko Firefox 2.0 Win 98+ / OSX.2+ 1.8 A
Gecko Firefox 3.0 Win 2k+ / OSX.3+ 1.9 A
Gecko Camino 1.0 OSX.2+ 1.8 A
Gecko Camino 1.5 OSX.3+ 1.8 A
Gecko Netscape 7.2 Win 95+ / Mac OS 8.6-9.2 1.7 A
Gecko Netscape Browser 8 Win 98SE+ 1.7 A
Gecko Netscape Navigator 9 Win 98+ / OSX.2+ 1.8 A
Gecko Mozilla 1.0 Win 95+ / OSX.1+ 1 A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接