如何使用Selenium重复获取内容<python>?</python>

时间:2015-02-07 02:17:51

标签: python-2.7 selenium

我正在抓取here的文字。我需要反复单击“加载更多参数”以获取页面上列出的所有参数。这是我的代码:

try:
    while True:
        link = WebDriverWait(driver, 5).until(
        EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))

        ActionChains(driver).move_to_element(link).perform()
        link.click()
        time.sleep(3) #wait for the update to occurr so the page loads"new arguments for you"
        print(driver.execute_script("return document.documentElement.outerHTML;"))

        if not (link):
            break
finally:
    None

这是错误:

File "debate.py", line 42, in <module>
  EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.44.0-py2.7.egg/selenium/webdriver/support/wait.py", line 71, in until
  raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: 

我确实获得了页面上列出的参数,但我认为我的代码有点奇怪,特别是在循环中。我想我需要一些东西来代替“如果没有”,就像“不可点击”一样。你能给我一些建议吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

是的,if not link:不是您想要的条件。如果这种情况确实如此,那么move_to_elementclick都不会起作用,因为它们和您的if not link:测试之间没有任何内容可以改变link引用元素为None(或其他一些错误值)。 link包含的元素引用可能会变为陈旧,但此类问题会生成特定异常。没有任何魔法可以将陈旧的引用变为None

很可能,您当前遇到的超时事件表明您已完成。一旦你加载了所有东西,我希望加载更多参数的按钮是不可点击的(因为它不再存在或因为它被禁用)。 (我无法验证这一点,因为您提供的链接会将我带到一个不能说明问题的页面。)

如果您中断异常,则可以退出循环。这也解决了没有参数的情况,或者没有足够的参数来保证按钮的存在:

from selenium.common.exceptions import TimeoutException

[....]

while True:
    try:
        link = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.LINK_TEXT, "Load More Arguments")))
    except TimeoutException:
        break
    [...]

一些注意事项:

  1. 外部try... finally块似乎没有做任何事情。

  2. 通常情况下,您可以在一次操作中移动并点击链接,link.click()应该在没有ActionChains的情况下运行。在一些非常罕见的情况下,您需要在点击之前执行移动。

  3. 您应该使用明确的等待替换您的time.sleep调用,该等待检查页面的状态以确定参数何时完成加载。