【问题标题】:Waiting for a table to load completely using selenium with python使用 selenium 和 python 等待表完全加载
【发布时间】:2014-10-03 00:01:06
【问题描述】:

我想从表格中的页面中抓取一些数据。所以我只关心表中的数据。早些时候我使用的是 Mechanize,但我发现有时会丢失一些数据,尤其是在表格的底部。谷歌搜索,我发现这可能是由于机械化没有处理 Jquery/Ajax。

所以我今天改用 Selenium。如何等待一个且只有一个表完全加载,然后使用 selenium 和 python 从该表中提取所有链接?如果我等待完整页面加载,则需要一些时间。我想确保只加载表中的数据。我当前的代码:

驱动程序 = webdriver.Firefox() 对于范围 (1, 2) 中的页面: driver.get("http://somesite.com/page/"+str(page)) 表 = driver.find_element_by_css_selector('div.datatable') 链接 = table.find_elements_by_tag_name('a') 对于链接中的链接: 打印链接.文本

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping


    【解决方案1】:

    使用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'))
    

    这将是一个显式等待


    或者,您可以使驱动程序wait implicitly

    隐式等待是告诉 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
    

    【讨论】:

    • 谢谢 :) present_of_element_located 的显式等待是否确保表已完全加载,而不仅仅是部分加载?抱歉,如果这个问题太愚蠢,我不知道。我也想要一些东西,这样我就不用等待页面中的其他元素而只等待表格。一旦表格加载完毕,我应该继续,而不是等待其他元素
    • @user3215014 如果 precense_of_element_located 在这里没有什么不同,设置和隐式等待 - 应该会有所帮助。
    • datatable是div的类型还是类名?
    【解决方案2】:

    也许您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2018-11-01
      • 2011-12-23
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多